我是Xpath的新人,我想知道你们是否可以帮助我。 我有2个XPath问题。
我有一个像这样的xml文件:
<test>
<test1></test1>
<test2></test2>
<test3>
<bla1></bla1>
<bla2></bla2>
</test3>
<test3></test3>
</test>
现在我要完成的是以下内容,我想获得除test3节点之外的所有节点。我已经尝试了/ * [not(name()='test3')]和我在网上找到的其他一些东西,但它们似乎都不起作用.. 也许你们可以帮助我?
XPath是否可以向xml添加节点?我怎么能这样做?
说我有这样的xml:
<rootnode>
<node1></node1>
</rootnode>
我想添加另一个节点,如何使用XPath执行此操作,或者这是不可能的?
感谢您的帮助。
来自评论:
我想得到除了的所有节点 test3节点(及其内部节点)。 所以如果test2中有
<bla>
,我 我想得到它。
我还有一个问题:p 假设我想按索引过滤test3节点。所以我想删除除第一个(或第二个或第三个,由我给出的索引定义)之外的所有test3节点。 如何做到这一点?
谢谢
答案 0 :(得分:2)
1:您只搜索根,但不搜索后代节点。此外,应避免name()
检查,因为在使用前缀和名称空间时它是不可靠的。试试这个:
//*[not(ancestor-or-self::test3)]
2:XPath仅查询XML。但是,有一些相关技术,如XSLT和XQuery,它们允许转换XML。或者,您可以在编程语言中使用DOM,您可以使用XPath来识别节点,然后使用DOM上的操作来修改它们。
答案 1 :(得分:1)
现在我要完成的是 下面,我想获得所有节点 除了test3节点。
使用强>:
//node()[not(ancestor-or-self::test3)
and
not(self::processing-instruction('test3'))]
|
//*[not(ancestor-or-self::test3)]/@*[not(name()='test3')]
|
//*[not(ancestor-or-self::test3)]/namespace::*[not(name()='test3')]
请注意,在XPath中,每个元素都是节点,但不是每个节点都是元素。上面的表达式选择文档中的每个节点,其名称不是test3
,并且没有名为test3
的父级或祖先。
XPath数据模型中存在以下类型的节点:
document-node()
(也称为“根节点”) - 由/
选择。
element()
节点,由child
轴中的名称测试选择,例如child::test3
仅test3
或child::*
或仅{{ 1}}。
*
节点,由text()
选择。
text()
节点,由comment()
comment()
节点,由processing-instruction()
或processing-instruction()
选择。
processing-instruction('someName')
节点,由attribute()
轴上的名称测试选择,例如attribute
或attribute::x
或@x
。
名称空间节点,由@*
轴上的名称测试或外卡选择,例如namespace
或namespace::x
。
请注意:节点测试namespace::*
选择上述7种类型的节点中的任何一种(当前指定或默认轴上允许使用。未指定轴,{{1选择上面类型1 - 5的任何节点。