【发布时间】:2011-02-08 23:09:32
【问题描述】:
我无法以编程方式浏览 XML 文档,出于我在最后描述的原因,我需要一个单行 XPath 解决方案。
我正在使用类似于下面的 XML 模式。 (这是我必须按原样使用的东西。)
<Root>
<!-- Child 1 -->
<Child>
<Name>Joe</Name>
<Age>12</Age>
</Child>
<!-- Child 2 -->
<Child>
<Name>Mike</Name>
<Age>25</Age>
</Child>
<!-- Child 3 -->
<Child>
<Name>Jane</Name>
<Age>20</Age>
</Child>
</Root>
假设我已经在“Joe”节点(即 Child 1 中的 Name 元素),我需要定义一个 XPath 查询来“包装”该节点,如下所示:
<Root>
<!-- Child 1 -->
<Child>
<Name>Joe</Name>
<Age>12</Age>
</Child>
</Root>
我尝试了各种祖先、字符串连接、连接等组合,但似乎找不到正确“包装”元素的解决方案。 (例如,我使用祖先的方式是返回 all 子节点,这不是我需要的。)
其他一些注意事项:
- 如果可能的话,解决方案必须是单行 XPath 查询(原因如下)。
- 它必须足够通用以适用于任何 Child 元素(例如,它不能假设我总是在第一个或第二个或第三个孩子)。
- 从上面的示例中,您可以看到我实际上并不需要实际的根节点本身,只需要它的标签(即我不希望它下面的所有子节点)。但是,我确实需要实际的子节点(以便获得名称和年龄)。
注意:对于它的价值,我实际上不能以编程方式导航 XML。我正在使用一个库(我无法更改其代码),在该库中,我必须根据配置文件中的单行 XPath 查询来定义所有内容。它基本上会浏览所有的 Name 元素,所以我的解决方案必须从那时开始工作。
【问题讨论】:
-
正如
xpath的 wiki 标签所述(也取自规范):XPath 的主要目的是处理 XML 文档的某些部分 它没有'不序列化新文档,与 XQuery 和 XSLT 相反。 -
好问题,+1。请参阅我的回答,了解为什么不能单独使用 XPath 完成此操作。
-
谢谢,亚历杭德罗。您的回答和 Dimitre 帮助我意识到我们需要一种不同的方法来解决这个问题。
标签: xpath parent-child ancestor