2011-10-31 8 views
6

このような単純な質問でお邪魔して申し訳ありませんが、私は時間のため、ここにこだわって:私がアクセスしようとしているXmlElement.SelectNodes(..) - 何も見つかりません。

<?xml version="1.0" encoding="utf-8"?> 
<aaa xmlns="http://blabla.com/xmlschema/v1"> 

    <bbb> 
    <ccc>Foo</ccc> 
    </bbb> 

    <ddd x="y" /> 
    <ddd x="xx" /> 
    <ddd x="z" /> 

</aaa> 

:私はこのようになりますxmlファイルを持っている

このような要素のDDD ':私は戻って.SelectNodes方法から任意のノードを得ることはありませんので、

var doc = new XmlDocument(); 
doc.Load("example.xml"); 
foreach (XmlNode dddNode in doc.DocumentElement.SelectNodes("//ddd")) 
{ 
    // do something 
    Console.WriteLine(dddNode.Attributes["x"].Value); 
} 

は、実行時にforeachループはスキップされます。私はループの前に壊れて、InnerXMLを見てみました。これはうまく見えました。また、 "// bbb"や "/ aaa/ddd"のようなあらゆる種類のXPathを試しましたが、 "/"だけが返されないようですヌル。

この正確なコードは以前私のために働いていましたが、現在はありません。私はaaaタグでその名前空間宣言の何かを疑っていますが、なぜこれが問題を引き起こすのか理解できませんでした。あなたが見逃すかもしれない何かを見てもらえますか?

答えて

10

これはxml-namespacesです。 dddはありません。ただし、x:dddhttp://blabla.com/xmlschema/v1へのエイリアスで、xです。あなたは、名前空間をテストする必要があります - 例えば:

var nsmgr = new XmlNamespaceManager(doc.NameTable); 
nsmgr.AddNamespace("x", "http://blabla.com/xmlschema/v1"); 
var nodes = doc.DocumentElement.SelectNodes("//x:ddd", nsmgr); 
// nodes has 3 nodes 

x以上で任意です。利便性以外はxには意味がありません。

これが(むしろ不便)あなたのXPath式のすべてに(上記のように、または別名)の名前空間を追加することを意味します。