通过忽略某些节点来提取XML

时间:2017-04-11 09:49:31

标签: sql-server xml

输入XML:

<Hierarchy><Relation>
        <Child>
        <Name>XYZ</Name>
        <Age>10</Age>
        </Child>
        <IsEldest>True</IsEldest>
        </Relation>
        <Relation>
        <Child>
        <Name>ABC</Name>
        <Age>5</Age>
        </Child>
        </Relation>
        <Relation>
        <Child>
        <Name>PQR</Name>
        <Age>3</Age>
        </Child>
        </Relation></Hierarchy>

预期结果:

          <Relation>
        <Child>
        <Name>ABC</Name>
        <Age>5</Age>
        </Child>
        </Relation>
        <Relation>
        <Child>
        <Name>PQR</Name>
        <Age>3</Age>
        </Child>
        </Relation>

如何在单个sql xml查询中使用sql server检索预期结果。 应提取不具有IsEldest标记的节点。 可以使用@ xml.modify选择使用IsEldes节点删除Relation标记。但是提取所需xml的任何其他方法?

2 个答案:

答案 0 :(得分:2)

@xml.query('//Relation[not(IsEldest[1]="True")]')

答案 1 :(得分:1)

您可以使用XQuery表达式FLWOR方法:

DECLARE @xml XML=
'<Hierarchy>
  <Relation>
    <Child>
      <Name>XYZ</Name>
      <Age>10</Age>
    </Child>
    <IsEldest>True</IsEldest>
  </Relation>
  <Relation>
    <Child>
      <Name>ABC</Name>
      <Age>5</Age>
    </Child>
  </Relation>
  <Relation>
    <Child>
      <Name>PQR</Name>
      <Age>3</Age>
    </Child>
  </Relation>
</Hierarchy>';

- 查询(根据TT。评论编辑)

SELECT @xml.query
(N'
    <Relation>
    {
    for $c in /Hierarchy/Relation[not(IsEldest[1]="True")]/Child
    return $c
    }
    </Relation>
');

结果

<Relation>
  <Child>
    <Name>ABC</Name>
    <Age>5</Age>
  </Child>
  <Child>
    <Name>PQR</Name>
    <Age>3</Age>
  </Child>
</Relation>