2009-08-07 18 views
8

Ho un documento xml con un elemento radice, due elementi figlio, 'diagnostica' e 'risultati'. L'elemento 'risultati' ha quindi un numero arbitrario di elementi con il nome 'risultato'C# XmlDocument SelectNodes

Quando questo viene caricato in un XmlDocument è facile navigare nella struttura e vedere che questo è esattamente come funzionano le cose. Posso scrivere una funzione ricorsiva che elimini tutti gli elementi "risultato". XmlDocument.SelectNodes ("// results") trova un nodo senza problemi.

Tuttavia, * XmlDocument.SelectNodes ("// results/result") non trova nulla.
* XmlDocument.SelectNodes ("// result") non trova nulla.

Ho parlato con un collega e ha avuto problemi con Xpath in XmlDocument.SelectNodes. Qualcun altro si imbatte in questo tipo di problema? Qualche soluzione?

file XML:

<?xml version="1.0" encoding="UTF-8"?> 
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:count="10" yahoo:created="2009-08-07T10:19:59Z" yahoo:lang="en-US" yahoo:updated="2009-08-07T10:19:59Z" yahoo:uri="http://query.yahooapis.com/v1/yql?q=select+*+from+search.news+where+query%3D%22Tanzania%22"> 
    <diagnostics> 
     <publiclyCallable>true</publiclyCallable> 
     <url execution-time="47"><![CDATA[http://boss.yahooapis.com/ysearch/news/v1/Tanzania?format=xml&start=0&count=10]]></url> 
     <user-time>49</user-time> 
     <service-time>47</service-time> 
     <build-version>2579</build-version> 
    </diagnostics> 
    <results> 
     <result xmlns="http://www.inktomi.com/"> 
      <abstract>Kakungulu Cup winners SC Villa face Tanzania’s Simba SC this afternoon at the National stadium in Dar es salaam. “We had a very tiresome journey. The road was so bad and the road blocks were so many. However, we finally reached but the boys were so tired,” said Kato.</abstract> 
      <clickurl>http://lrd.yahooapis.com/_ylc=X3oDMTQ4cXAxcnRoBF9TAzIwMjMxNTI3MDIEYXBwaWQDb0pfTWdwbklrWW5CMWhTZnFUZEd5TkouTXNxZlNMQmkEY2xpZW50A2Jvc3MEc2VydmljZQNCT1NTBHNsawN0aXRsZQRzcmNwdmlkA21VVGlta2dlQXUzeEYuM0xGQkQzR1pUU1FIS0dORXA4cUk4QUJJX1U-/SIG=12vhpskdd/**http%3A//www.monitor.co.ug/artman/publish/sports/SC_Villa_face_Simba_in_Tanzania_89289.shtml</clickurl> 
      <date>2009/08/07</date> 
      <language>english</language> 
      <source>The Monitor</source> 
      <sourceurl>http://www.monitor.co.ug/</sourceurl> 
      <time>20:22:32</time> 
      <title>SC Villa face Simba in Tanzania</title> 
      <url>http://www.monitor.co.ug/artman/publish/sports/SC_Villa_face_Simba_in_Tanzania_89289.shtml</url> 
     </result> 

XPATH

doc.SelectNodes ("// risultato") non produce colpi.

+0

Hai un campione di xml in questione? È possibile che i tuoi elementi "risultato" siano effettivamente in uno spazio dei nomi diverso rispetto agli elementi "risultati"? Ci sono dei prefissi qualificanti sugli elementi? –

risposta

18

Rob e Le risposte di Marc stanno probabilmente andando nella giusta direzione: XmlDocument + namespace + XPath può essere un po 'un problema.

Se si è in grado di utilizzare .NET 3.5, si consiglia di utilizzare LINQ su XML. Che renderebbe davvero facile:

XDocument doc = XDocument.Load("foo.xml"); 
XNamespace ns = "bar"; 
var results = doc.Descendants(ns + "result"); 

foreach (var result in results) 
{ 
    ... 
} 

Fondamentalmente LINQ to XML è un'API superiore in quasi ogni modo, nella mia esperienza :) (credo che ci sono alcune funzionalità che manca, ma se si ha accesso a .NET 3.5 vale sicuramente la pena provarlo.)

+0

Grazie Jon, ho fatto il passaggio a LINQ ed è molto più bello! :) – Daniel

+0

questo lo ha fatto per me, ma era la parte XNamespace che era il mio problema. io * odio * per dare a Jon Skeet altri punti ... ma, ... coda lunga e tutto il resto. –

+3

@John: Se è una qualsiasi consolazione, il tuo uptote non mi ha dato altri rep. Ho raggiunto il rep cap circa 9 ore fa. –

12

Mi sembra che i namespace siano i problemi; in genere necessario mobilitare l'aiuto di un XmlNamespaceManager per questo, e utilizzare un alias nelle query, cioè

doc.SelectNodes("//x:results/x:result", nsmgr); 

(dove x è definito in nsmgr come alias per un determinato spazio dei nomi)

+0

Grazie Mark, era esattamente così. – Daniel

Problemi correlati