Avatar billede dr_chaos Nybegynder
22. april 2006 - 10:29 Der 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 ?
Avatar billede dr_chaos Nybegynder
22. april 2006 - 10:36 #1
Eller findes der en en anden måde  ?
Avatar billede tuxic Nybegynder
22. april 2006 - 11:18 #2
Hvilken kode har du prøvet?

Tip: få et skema for webservicen, brug xsd.exe fra frameworket og XmlSerializer i stedet.

Det kan også være der findes noget framework kode der automatisk giver en klasse givet en webservice.
Avatar billede dr_chaos Nybegynder
22. april 2006 - 11:24 #3
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.
Avatar billede tuxic Nybegynder
22. april 2006 - 11:54 #4
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.
Avatar billede dr_chaos Nybegynder
22. april 2006 - 12:34 #5
jeg skal behandle den xml der komm er return
Avatar billede dr_chaos Nybegynder
22. april 2006 - 12:43 #6
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.
Avatar billede dr_chaos Nybegynder
22. april 2006 - 13:02 #7
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 ?
Avatar billede tuxic Nybegynder
22. april 2006 - 13:39 #8
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 :))

//STATUS
?
Avatar billede dr_chaos Nybegynder
22. april 2006 - 13:50 #9
har prøvet begge ting.
         
med //. finder den 4 items men kan bare ikke få den til at finde noget som helst med
//STATUS eller lignende.

Det giver absolut ingen mening for mig.
Et eller andet må jeg gøre forkert.
Avatar billede tuxic Nybegynder
22. april 2006 - 13:53 #10
Den pæne løsning er jo nok at bruge en xmlnsresolver.

*//STATUS
?
Avatar billede dr_chaos Nybegynder
22. april 2006 - 14:00 #11
ingen forandring

mener du XmlResolver ?
Avatar billede dr_chaos Nybegynder
22. april 2006 - 14:28 #12
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 );
         
smid et svar så deler vi i porten :)
Avatar billede tuxic Nybegynder
22. april 2006 - 20:07 #13
Najs nok.
Avatar billede segato Nybegynder
26. april 2006 - 11:35 #14
En lidt pænere løsning ville have været at bruge [local-name()='Node du leder efter']
Avatar billede segato Nybegynder
26. april 2006 - 11:35 #15
*[local-name()='Status']
Avatar billede dr_chaos Nybegynder
26. april 2006 - 11:42 #16
ok det vil jeg lige prøve
Avatar billede tuxic Nybegynder
26. april 2006 - 16:57 #17
Jeg ved ikke om det er pænere. Kendte ikke lige local-name. Det virker som om det betyder at man ser bort fra namespacet?
Avatar billede segato Nybegynder
27. april 2006 - 09:59 #18
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.
Avatar billede tuxic Nybegynder
27. april 2006 - 20:36 #19
Det tror jeg nu ikke jeg er helt enig i. Namespaces er en feature synes jeg.
Avatar billede segato Nybegynder
28. april 2006 - 11:48 #20
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.
Avatar billede dr_chaos Nybegynder
29. april 2006 - 09:18 #21
hmm hvordan får du den til at virker segato ?:
prøvede med:
System.Diagnostics.Debug.WriteLine((n.SelectSingleNode("*[local-name()='STATUS']").InnerXml);
?
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester