22. april 2006 - 10:29Der er
19 kommentarer og 2 løsninger
Problemer med xpath giver gråhår
Hej allesammen. Jeg får en xml node tilbage fra en webservice og den kan se ud på denne måde: <INFORM xmlns="https:enadresse"><STATUSINFO><STATUS>100</STATUS></STATUSINFO></INFORM>
Jeg gemmer xmlnoden i en variabel kaldet n. Mit problem er at jeg ikke kan få n.SelectSingleNode til at virker. Uanset hvilken en xpath jeg har forsøgt mig med virker det ikke. Jeg får kun en nullreference ud af det. Hvilken xpath skal jeg bruge for at vælge "STATUS" elementet ?
jeg har generet en proxyclass osv af webservicen. Hvis det er det du mener med at få en schema af webservicen.
jeg har f.eks. forsøgt: n.SelectSingleNode("/INFORM/STATUSINFO/STATUS") n.SelectSingleNode("/STATUSINFO/STATUS") n.SelectSingleNode("/STATUS") n.SelectSingleNode("STATUS") Men jeg kan ikke få det til at virke.
Hmm har ikke kode kørende her. Prøv med det stygge wildcard //. Kan det være noget med namespacet? (var ikke klar over at man kan have https, troede kun http var mulig). Hvis du har en klasse der repræsenterer svaret fra servicen er der vel ingen grund til at rode direkte med xml'en.
Hvad mener du med noget med namespacet ? Mht //. finder den 4 elementer. Jeg skal hive værdier ud af den xml der kommer tilbage. Det er basalt set det jeg forsøger at gøre.
jeg kan se at hvis <INFORM xmlns="https:enadresse"><STATUSINFO><STATUS>100</STATUS></STATUSINFO></INFORM> ændres til <INFORM><STATUSINFO><STATUS>100</STATUS></STATUSINFO></INFORM> så kan jeg godt bruge selectnodes. Hvorfor det ?
Det er så netop namespacet. "xmlns" står for xmlnamespace. Xmlnamespaces har samme rolle som namespaces i fx C#. Prøv at se på den overload af selectnodes der tager en xmlnamespaceresolver (ca :))
fik det løst med: XmlNamespaceManager nsmgr = new XmlNamespaceManager(n.OwnerDocument.NameTable); nsmgr.AddNamespace("ab", "https:enadresse"); System.Diagnostics.Debug.WriteLine(n.SelectSingleNode("//ab:STATUS", nsmgr).InnerXml );
Det er helt rigtigt. Det der gør det pænere er at du ikke skal kende alle namespaces eller ændre din kode senerehen hvis der kommer nye namespaces i xml'en.
Det kommer jo helt an på hvad man vil. I nogle tilfælde hvor man vil differentiere på tags fra forskellige namespaces så har du ret. Men det er godt nok sjældent jeg har oplevet det. Ikke en gang wordML har overlappende tags.
Så jeg vil sige det kommer an på det enkelte tilfælde.
hmm hvordan får du den til at virker segato ?: prøvede med: System.Diagnostics.Debug.WriteLine((n.SelectSingleNode("*[local-name()='STATUS']").InnerXml); ?
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.