2009-09-02 10 views
4

解析XMLドキュメント、C#の

<root xmlns:n="http://www.w3.org/TR/html4/"> 
<n:node> 
    <n:node> 
    data 
    </n:node> 
</n:node> 
<n:node> 
    <n:node> 
    data 
    </n:node> 
</n:node> 
</root> 

のXPathのすべての論文を名前空間には、次の操作を実行するために私に語った:

XmlNamespaceManager mgr = new XmlNamespaceManager(xmlDoc.NameTable); 
mgr.AddNamespace("n", "http://www.w3.org/1999/XSL/Transform"); 

そして、私は上記のコードを追加した後、クエリ

xmlDoc.SelectNodes("/root/n:node", mgr); 

は罰金実行しますが、何も返しません。次:私は、XMLファイルを変更し、名前空間を削除した場合、他のすべてが正しく設定されているようですので

xmlDoc.SelectNodes("/root/node", mgr); 

は、二つのノードを返します。それがなぜ動作するかについてのアイデアは名前空間ではありませんか?

ありがとう!

+0

この回答も役に立ちます:http://stackoverflow.com/questions/4191084/linq-to-xml-problem-with-colon-in-the-xml-tags/8862051#8862051 –

答えて

6

これは、プレフィックスではなく重要な名前空間のURIです。あなたは以下のように使用することができ、あなたのxmlを考える

mgr.AddNamespace("someOtherPrefix", "http://www.w3.org/TR/html4/"); 
var nodes = xmlDoc.SelectNodes("/root/someOtherPrefix:node", mgr); 

これは、あなたが望むデータを提供します。この概念を理解すると、特に、各URIにプレフィックスを割り当てて好きなドキュメントのどの部分をも強く参照することができることがわかっているので、デフォルトの名前空間(ソースxmlのプレフィックスはありません)になると簡単になります。

+0

ありがとう。それは重要なURIであったことは私には起こりませんでしたが、このような目立たない矛盾を見逃すことは私の愚かでした。 – Vercinegetorix

+0

はい、これはあまり直感的ではありませんが、あなたがそれを知った今、あなたはそれを知っています。 –

2

AddNamespaceメソッドで指定したURIが、xmlns宣言のURIと一致しません。

1

"http://www.w3.org/1999/XSL/Transform"という名前空間を表す接頭辞 "n"を宣言すると、クエリの実行時にノードが一致しません。これは、ドキュメント内の接頭辞「n」が名前空間「http://www.w3.org/TR/html4/」を参照しているためです。

代わりにmgr.AddNamespace("n", "http://www.w3.org/TR/html4/");を実行してください。