Analizza XML con syntax di syntax

Nella mia applicazione, sto convertendo da un servizio web a un altro. Ottengo una risposta XML come XmlDocument . Sto cercando di ottenere nodes specifici nel documento. So che ci sarà sempre una sola istanza del nodo che sto cercando. Il precedente implementatore è riuscito a ottenere esattamente ciò che desidera con:

 XmlNode node = xmlDoc.SelectSingleNode("//result/geometry/location/lat/text()"); 

Sto cercando di fare lo stesso con la mia risposta, ma ottengo sempre nulla. Conosco (vagamente) la sua risposta XML e conosco il mio. Ma non posso usare la sua syntax. Ottengo null non importa cosa. Sto usando una frase più complessa:

 XmlNode xmlNode = xmlDoc.GetElementsByTagName("StatusDescription").Item(0); 

Ma, come puoi vedere, è brutto. E – peggio – quando cerco di andare più di un nodo in profondità, ottengo null:

 XmlNode xmlNode = xmlDoc.GetElementsByTagName("/ResourceSets/ResourceSet").Item(0); 

Ho provato a inserire e rimuovere le barre in diversi punti, ma senza risultato. L’XML che il precedente implementatore è tornato non è niente di speciale; è solo XML. Ma può saltare dappertutto con facilità.

Ecco un frammento della sua risposta XML:

  OK    37.4217550 -122.0846330     

Ecco un mio frammento:

  200 OK   1   ...      

Qualche idea su come posso attraversare l’XML facile come lui?

La differenza fondamentale qui è che il suo XML non ha uno spazio dei nomi predefinito, mentre il tuo ha uno spazio dei nomi predefinito dichiarato qui:

 xmlns="http://schemas.microsoft.com/search/local/ws/rest/v1" 

A proposito, questo argomento (query XPath contro XML con namespace di default) è stato chiesto molto prima in varie forms qui in SO. Si noti che l’elemento in cui viene dichiarato uno spazio dei nomi predefinito e tutti i relativi discendenti senza prefisso e senza una diversa dichiarazione dello spazio dei nomi predefinita vengono considerati in tale spazio dei nomi predefinito sopra menzionato. E un ansible modo per interrogare un elemento in un namespace è mappare un prefisso allo spazio dei nomi uri usando un gestore di namespace e quindi usando correttamente il prefisso mappato in XPath, ad esempio:

 var nsManager As New XmlNamespaceManager(new NameTable()); nsManager.AddNamespace("d", "http://schemas.microsoft.com/search/local/ws/rest/v1"); XmlNode xmlNode = xmlDoc.SelectSingleNode("//d:StatusDescription", nsManager);