XPath& Xml修改

时间:2010-11-18 21:02:03

标签: xml xpath

我是Xpath的新人,我想知道你们是否可以帮助我。 我有2个XPath问题。

问题1

我有一个像这样的xml文件:

<test>
   <test1></test1>
   <test2></test2>
   <test3>
      <bla1></bla1>
      <bla2></bla2>
   </test3>
   <test3></test3>
</test>

现在我要完成的是以下内容,我想获得除test3节点之外的所有节点。我已经尝试了/ * [not(name()='test3')]和我在网上找到的其他一些东西,但它们似乎都不起作用.. 也许你们可以帮助我?

问题2

XPath是否可以向xml添加节点?我怎么能这样做?

说我有这样的xml:

<rootnode>
  <node1></node1>
</rootnode>

我想添加另一个节点,如何使用XPath执行此操作,或者这是不可能的?

感谢您的帮助。

来自评论:

  

我想得到除了的所有节点   test3节点(及其内部节点)。   所以如果test2中有<bla>,我   我想得到它。

问题3

我还有一个问题:p 假设我想按索引过滤test3节点。所以我想删除除第一个(或第二个或第三个,由我给出的索引定义)之外的所有test3节点。 如何做到这一点?

谢谢

2 个答案:

答案 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数据模型中存在以下类型的节点

  1. document-node()(也称为“根节点”) - 由/选择。

  2. element()节点,由child轴中的名称测试选择,例如child::test3test3child::*或仅{{ 1}}。

  3. *节点,由text()选择。

  4. text()节点,由comment()

  5. 选择
  6. comment()节点,由processing-instruction()processing-instruction()选择。

  7. processing-instruction('someName')节点,由attribute()轴上的名称测试选择,例如attributeattribute::x@x

  8. 名称空间节点,由@*轴上的名称测试或外卡选择,例如namespacenamespace::x

  9. 请注意:节点测试namespace::*选择上述7种类型的节点中的任何一种(当前指定或默认轴上允许使用。未指定轴,{{1选择上面类型1 - 5的任何节点。