使用XPath从XML排除孙子

汤米伯格隆德

使用SQL Server 2017读取XML结构时尝试排除特定的孙代。

我有一个示例结构,如下所示:

<root>
    <a id="parent">
        <b id = "child1">
            <c id = "grandchild1"/>
            <c id = "grandchild2"/>
        </b>
        <b id = "child2">
            <c id = "grandchild3"/>
            <c id = "grandchild4"/>
        </b>
    </a>
</root>

c[not(contains(@id,"grandchild3"))]当我导航到例如node时,可以排除使用的特定子项<b id = "child2">

但是,当从根节点处理其余XML时,如何排除该特定孙代呢?

我想收到的以便将其写入文件的结构是这样的:

<root>
    <a id="parent">
        <b id = "child1">
            <c id = "grandchild1"/>
            <c id = "grandchild2"/>
        </b>
        <b id = "child2">
            <c id = "grandchild4"/>
        </b>
    </a>
</root>

可以看出grandchild3,这种结构现在缺少了。

阿卡什

SELECT令人惊讶地涉及到在a中执行此操作,但是幸运的是您不需要这样做。您可以复制xml,使用进行修改.modify,然后使用:

declare @original xml = '<root>
    <a id="parent">
        <b id = "child1">
            <c id = "grandchild1"/>
            <c id = "grandchild2"/>
        </b>
        <b id = "child2">
            <c id = "grandchild3"/>
            <c id = "grandchild4"/>
        </b>
    </a>
</root>'

declare @new xml = @original

set @new.modify('delete //c[@id="grandchild3"]')

select @new

<root>
  <a id="parent">
    <b id="child1">
      <c id="grandchild1" />
      <c id="grandchild2" />
    </b>
    <b id="child2">
      <c id="grandchild4" />
    </b>
  </a>
</root>

如预期的。

xpath的//c[@id="grandchild3"]意思是“具有值属性的任何c节点(文档中的任何地方)”。idgrandchild3

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章