2017-04-11 8 views
1

入力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サーバーを使用して期待される結果を取得するにはどうすればよいです。 IsEldestタグを持たないノードを抽出する必要があります。 @ xml.modifyを使用してIsEldesノードでリレーションタグを削除するオプションがあります。しかし、必要なXMLを抽出する他の方法?

+0

Might ther e ' True 'の値が' True '以外の値である可能性がありますか?この場合、どうしたらいいでしょうか? – Shnugo

答えて

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

私はこの質問を私の側から完全に誤解しました! – Shnugo

+0

ありがとうございましたJeroen、これは動作します。私は@ xml.query( '// Relation [(IsEldest [1]!= "True")]')で試していましたが、明らかに動作しませんでした。 – Kapil

1

あなたがFLWORアプローチでXQuery表現を使用する場合があります。

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>'; 

--Theクエリ(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> 
+0

@TT。 Thx、私は完全にこの疑問を誤解しました!ジェーレンの答えはより良いです... – Shnugo

関連する問題