2009-04-30 20 views
5

Pracuję z dokumentu XML, który zawiera strukturę, która wygląda podobnie do tego:Dlaczego funkcja SelectSingleNode zwraca wartość null?

<MT> 
    <Events> 
    <event id="1"> 
     <field name="blah" value="a_value" type="atype" /> 
     . 
     . 
     . 
    </event> 
    </Events> 
</MT> 

Jestem aktualnie załadowany ten z pliku do dokumentu XML w ten sposób:

XmlDocument xdoc = new XmlDocument(); 
xdoc.Load("somefile.xml"); //Successfully loads btw 

Jednakże używam do problemu i tylko z tego jednego konkretnego dokumentu, gdy próbuję uruchomić następną linię kodu:

jestem na platformie ht track przez zgadywanie, że to jest zwracanie wartości null z powodu problemu z użyciem atrybutu o nazwie "id" lub czy brakuje mi czegoś w kodzie?

Odpowiedz

9

nie może replikować to za pomocą pliku XML

<MT> 
    <Events> 
    <event id="1"> 
     <field name="blah" value="a_value" type="atype" /> 
    </event> 
    </Events> 
</MT> 

i kod

XmlDocument doc = new XmlDocument(); 
doc.Load(@"C:\test.xml"); 

XmlNode node = doc.SelectSingleNode("//event[@id='1']"); 

Zwraca niezerową węzła zgodnie z oczekiwaniami.

Aktualizacja

Po dodaniu xmlns="example.org" do elementu <MT>, musiałem skonfigurować menedżera nazw dla XPath i używać nazw dla tego wydarzenia. Nie można uzyskać domyślnego obszaru nazw do działania z jakiegoś powodu.

XmlDocument doc = new XmlDocument(); 
doc.Load(@"D:\test.xml"); 

XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable); 
manager.AddNamespace("e", "http://example.org"); 

XmlNode node = doc.SelectSingleNode("//e:event[@id='1']", manager); 

Jedno mylić mnie, gdy próbuje uzyskać to do pracy. Dlaczego XmlNamespaceManager potrzebuje XmlNameTable z dokumentu, jeśli nie po to, aby dowiedzieć się, jakie obszary nazw zawiera? W jaki sposób muszę zdefiniować przestrzeń nazw NameTable i? Byłbym wdzięczny, gdyby ktoś, kto wie, mógł rzucić krótki komentarz.

+0

Odpowiadając na moje własne pytanie. XmlNameTable służy do optymalizacji porównań ciągów i domyślam się, że powód, dla którego można nadać XmlNamespaceManager istniejącą tabelę nazw, umożliwia szybkie porównywanie z elementami XmlDocument, ponieważ te następnie dzielą tabelę nazw. –

+0

Twoja aktualizacja wydaje się mieć sens. Próbowałem umieścić skróconą formę xml i zapomniałem opublikować przestrzeń nazw. Dziękuję za poświęcenie dodatkowego czasu, aby spróbować to wymyślić. Po usunięciu przestrzeni nazw z oryginalnego xml wszystko działa tak, jak powinno. Zdecydowanie warte więcej przestudiowania przestrzeni nazw System.Xml. –

Powiązane problemy