【问题标题】:Check if element node contains no text using java and Xpath?使用 java 和 Xpath 检查元素节点是否不包含文本?
【发布时间】:2016-10-19 01:39:12
【问题描述】:

我是 Xpath 的新手。我面临一个问题,我必须从 Xpath 获得布尔响应,如果一个元素不包含任何文本,那么它应该返回 false,否则返回 true。我看过很多例子,我没有太多时间学习 Xpath 表达式。下面是 XML 文件。

<?xml version="1.0" encoding="UTF-8" ?>
<order id="1234" date="05/06/2013">
  <customer first_name="James" last_name="Rorrison">
    <email>j.rorri@me.com</email>
    <phoneNumber>+44 1234 1234</phoneNumber>
  </customer>
  <content>
    <order_line item="H2G2" quantity="1">
      <unit_price>23.5</unit_price>
    </order_line>
    <order_line item="Harry Potter" quantity="2">
      <unit_price></unit_price>//**I want false here**
    </order_line>
  </content>
  <credit_card number="1357" expiry_date="10/13" control_number="234" type="Visa" />
</order>

您能否指出正确的方向来为这个问题创建 xpath 表达式。

我想要的是如下表达式(虚拟表达式)。

/order/content/order_line/unit_price[此时我想进行验证,该验证将根据 isNull 或 notNull 的某些检查返回 true 或 false]。

【问题讨论】:

  • credit_card 节点也不包含文本 - 您是否希望这也返回 false?
  • 我没有注意到这一点。但我可以给你一个我想要的样本。让我编辑问题。

标签: java xpath


【解决方案1】:

以下 xpath 将执行此操作:

not(boolean(//*[not(text() or *)]))

但是这个 xpath 也将包含 credit_card 节点,因为它不包含任何文本(属性不是 text())。

如果您还想排除具有属性的节点,请使用此..

not(boolean(//*[not(text() or * or @*)]))

编辑后,您可以执行此操作..

/order/content/order_line/unit_price[not(text()]

它将返回一个没有文本的节点列表,您可以从那里针对您的测试的节点数进行测试。

或返回真/假..

not(boolean(/order/content/order_line/unit_price[not(text()]))

【讨论】:

  • 我只想验证一个节点,即unit_price。为此,我无法找到任何解决方案。我得到的是给出文本不存在的所有节点的示例。我需要的是一个 Xpath 表达式,它将为单个节点条件(不带属性)返回 false 或 true。
  • 然后选择上面的第一个或第二个选项并将 //* 替换为 /order/content/order_line/unit_price。我将编辑该行以使其正确。
  • 我不需要没有文本的节点列表。我想验证一个节点是否为空值或空值。我正在尝试您的第二个解决方案。
  • 成功了。非常感谢@Phil B。你能告诉我在哪里可以学习在 Xpath 中使用布尔检查吗?
  • 我所有的东西都是从 Michael Kay(也是 SO 上的高级人物)的《Xslt Programmers Reference》一书中学到的。去拿吧……这是我读过的关于这个主题的最好的书之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
相关资源
最近更新 更多