2011-10-31 23 views
6

böyle basit bir soruyla rahatsız ettiğim için üzgünüm ama bir saat beri burada sıkışıp kaldım:XmlElement.SelectNodes (..) - hiçbir şey bulamıyor .. Yardım?

<?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> 

erişmeye çalışıyorum:

Ben şuna benzer bir xml dosyası var böyle elemanların ddd ': geri .SelectNodes yönteminden herhangi düğümleri alamadım çünkü

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

çalışma zamanında foreach döngüsü atlanır. Döngüden önce kırdım ve InnerXML'e bir göz attım, bu iyi görünüyor ve aynı zamanda her türlü XPath denedim ("// bbb" veya "/ aaa/ddd" gibi), ama sadece "/" geri dönmeyecek gibi görünüyor boş.

Bu tam kod benim için daha önce çalıştı, şimdi değil. Aaa etiketindeki ad alanı bildirimi ile ilgili bir şeyden şüpheleniyorum, ancak bunun neden sorunlara yol açacağını anlayamadım. Ya da .. eksik olduğum bir şey görebiliyor musun?

cevap

10

Bu, xml-ad boşluklarıdır. ddd yoktur. Bununla birlikte, x:ddd, x'un http://blabla.com/xmlschema/v1 numaralı diğer adınızdır. Sen ad ile test etmek gerekir - örneğin:

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 

Not Yukarıdaki keyfi içinde x; x'da rahatlıktan başka bir anlam yoktur.

Bu

(yerine inconveniently) (yukarıdaki gibi, ya da bir takma ad) size xpath ifadelerin tüm içine ad eklenmesi anlamına gelir.