【问题标题】:Return string where no node exists Xpath返回不存在节点的字符串 Xpath
【发布时间】:2016-11-27 21:00:29
【问题描述】:

我有一些看起来像这样的 XML:

<contacts>
    <person>
        <name>Bob</name>
        <phoneNumber>1234</phoneNumber>
        <mobileNumber>5678</mobileNumber>
        <address>Address 1</address>
    </person>
    <person>
        <name>Sue</name>
        <phoneNumber>4321</phoneNumber>
        <address>Address 2</address>
    </person>
</contacts>

还有一些 Xpath 查询&lt;person&gt; 的所有子节点:

//name | //phoneNumber | //mobileNumber | //address

结果是这样的:

Bob
1234
5678
Address 1
Sue
4321
Address 2

我希望 Xpath 查询返回一些内容(字符串?),以便我可以确定哪个 &lt;person&gt; 缺少子节点(在这种情况下,第二个人没有 &lt;mobileNumber&gt;

我想要的输出如下所示:

Bob
1234
5678
Address 1
Sue
4321
null
Address 2

谢谢,如果您需要更多详细信息,请告诉我!

更新

该表达式必须对 Xpath 1.0 有效,因为我使用的是 javascript 的 document.evaluate

更新

我对这个表达式有一些了解:

concat(substring(/contacts/person/mobileNumber, 1 div boolean(/contacts/person/mobileNumber)),substring('null', 1 div not(/contacts/person/mobileNumber)))

但是它现在只计算第一个 &lt;person&gt; 而第二个不返回任何内容。有什么建议吗?

【问题讨论】:

  • 使用 XPath 1.0,您可以使用 this answer 中描述的 hack。
  • //人 | //人/*
  • @nwellnhof 谢谢,这为我指明了方向。请参阅上面的更新:)

标签: xml xpath


【解决方案1】:

xpath 查询无法创建节点; xslt 用于创建/转换 xml。我建议,您使用 xpath 选择所有人员节点,然后使用 javascript 来迭代人员的子节点。在迭代循环中,您可以获得每个节点的文本,同时对丢失的 mobileNumber 节点的测试做出相应的反应。

【讨论】:

  • 我不希望 xPath 创建节点,只返回不存在节点的东西。
  • 您的示例 xpath 和结果表明您正在使用一组节点。扩展我的初始句子 - xpath 用于从现有 xml 文档中选择节点,它不能创建节点。就像 SQL SELECT 从 db 表中选择行但不能插入行一样。您的第二次更新不起作用的原因是因为第二个人中没有要匹配的 mobileNumber 节点。您需要在 源文档 中添加第二个人下的空 mobileNumber,因为就像我说的那样,xpath 无法创建节点。
  • 是的,但是要使用您的 SQL 示例,您可以执行 WHERE NOT EXISTS 之类的操作来突出显示不存在数据的位置。如果您传入&lt;mobileNumber&gt; 的位置,则上面的示例有效(例如&lt;mobileNumber&gt;[1] 返回5678&lt;mobileNumber&gt;[2] 返回null
  • 使用 mobileNumber[2] 时,您选择的是单个节点或 null(缺失节点),然后 concat() 使用该值返回单个文本结果。如果您只想要一个值结果,那么您可以这样做,但您想要一组节点(如问题中所示),您不能让 xpath '注入'一个不存在的节点。让我们不要偏离 SQL 的主题,而是澄清一下..WHERE NOT EXISTS 不会创建行,它会测试不存在并且可用于创建列但不能创建行。 xml 节点集类似于 sql 行集。我以 sql 为例,只是为了强调 xpath 在集合上的作用。
猜你喜欢
  • 2011-05-13
  • 2023-04-04
  • 2010-11-27
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 2011-12-10
  • 2015-06-21
  • 1970-01-01
相关资源
最近更新 更多