2017-01-27 18 views
1

名前空間には属性がほとんどないxmlがありますが、要素の名前空間とは異なります。SQL Server:名前空間が要素と異なる名前のXML属性から値を取得する

サンプルXML:上記のサンプルでは

<d:dataroot xmlns:m="urn:schemas-microsoft-com:xml-m" xmlns:d="urn:schemas-microsoft-com:xml-d"> 
    <Books xmlns="http://tempuri.org/Books.xsd"> 
    <Book d:id="1" m:name="Book1" isbn="123"> 
     <Author>John</Author> 
    </Book> 
    <Book d:id="2" m:name="Book2" isbn="124"> 
     <Author>John</Author> 
    </Book> 
    </Books> 
</d:dataroot> 

、私は

DROP TABLE #TestXml 
CREATE TABLE #TestXml (XMLDATA XML); 
INSERT INTO #TestXml (XMLDATA) VALUES ('<d:dataroot xmlns:m="urn:schemas-microsoft-com:xml-m" xmlns:d="urn:schemas-microsoft-com:xml-d"> 
    <Books xmlns="http://tempuri.org/Books.xsd"> 
    <Book d:id="1" m:name="Book1" isbn="123"> 
     <Author>John</Author> 
    </Book> 
    <Book d:id="2" m:name="Book2" isbn="124"> 
     <Author>John</Author> 
    </Book> 
    </Books> 
</d:dataroot>'); 

SELECT * FROM #TestXml 
WHERE XMLDATA.exist('//*:Book[@isbn="124"]') = 1 

--;WITH XMLNAMESPACES (DEFAULT 'urn:schemas-microsoft-com:xml-d') 
--SELECT * FROM #TestXml 
--WHERE XMLDATA.exist('//*:Book[d:@id="2"]') = 1 

下のスクリプトを実行すると、クエリisbn doesntのように1に戻り、予想される結果はすべての名前空間を持っていますが、私は実行するとコメントクエリ私は以下のエラーを取得

Msg 9303, Level 16, State 1, Line 20 
XQuery [#TestXml.XMLDATA.exist()]: Syntax error near ':', expected ']'. 

試したさまざまな方法クエリの属性の名前空間を指定しますが、成功しません。

他のネームスペースを持つxml属性を、その中にある要素のネームスペースと照合する方法を知っている人はいますか?ありがとう。

答えて

1

あなたは<dataroot>要素は、このトップレベルの要素に適用されるd XML名前空間を定義しますが、その下に<Books>が新しいデフォルトを定義

.....あなたのXML名前空間には本当に注意する必要があります XML名前空間http://tempuri.org/Books.xsdこのノードとその子に適用されます。

したがって、あなたのデータを取得するには、このクエリを使用する必要があります。

;WITH XMLNAMESPACES ('urn:schemas-microsoft-com:xml-d' AS d, 
        'http://tempuri.org/Books.xsd' AS ns) 
SELECT * 
FROM #TestXml 
WHERE XMLDATA.exist('/d:dataroot/ns:Books/ns:Book[@isbn="124"]') = 1 

更新:とあなたが@id属性に、それをベースにする場合は、この使用:

;WITH XMLNAMESPACES ('urn:schemas-microsoft-com:xml-d' AS d, 
        'http://tempuri.org/Books.xsd' AS ns) 
SELECT * 
FROM #TestXml 
WHERE XMLDATA.exist('/d:dataroot/ns:Books/ns:Book[@d:id="1"]') = 1 

@name属性に基づいて作成する場合は、次のようにします。

;WITH XMLNAMESPACES ('urn:schemas-microsoft-com:xml-d' AS d, 
        'urn:schemas-microsoft-com:xml-m' AS m, 
        'http://tempuri.org/Books.xsd' AS ns) 
SELECT * 
FROM #TestXml 
WHERE XMLDATA.exist('/d:dataroot/ns:Books/ns:Book[@m:name="Book1"]') = 1 
+0

ありがとうございますが、isbnを使ってクエリを実行しても問題ありません。問題は、名前空間が異なるため、クエリで属性idとnameを使用していることです。 –

+0

@TonyStark:私の応答を更新しました - それはあなたが探している解決策ですか? –

+1

はい、まさに私が探していたものです。属性のために名前空間の先頭に '@'を付ける必要はありません。ありがとう。 –

関連する問題