Avatar billede o-zone Nybegynder
12. december 2006 - 13:05 Der er 5 kommentarer og
3 løsninger

Hvordan får jeg XPathNavigator til at bruge XPath?

Hej med jer ...

Det lyder ellers som om det burde være let - men der er jo nok et eller andet jeg har misforstået :-(

Jeg har et program (i C#) som skal hente udvalgte data ud af et XML document. Jeg er interesseret i at mest muligt foregår vha. XPath, så det bliver så dynamisk som muligt (altså ikke noget med at jeg SKAL kende den eksakte position for de forskellige oplysninger)

Mit XML dokument ser noget generaliseret ud som nedenstående:
<root>
  <element>
    <data1>værdi 1a</data1>
    <data2>værdi 2a</data2>
    <data3 data="værdi3a" />
  </element>
  <element>
    <data1>værdi 1b</data1>
    <data2>værdi 2b</data2>
    <data3 data="værdi3b" />
  </element>
  <element>
    <data1>værdi 1c</data1>
    <data2>værdi 2c</data2>
    <data3 yada="værdi3c" />
  </element>
</root>

Jeg har hentet dokumentet ind, oprettet en XPathNavigator xpath = root.CreateNavigator();
Jeg har en XPathNodeIterator som i en while (iterator.MoveNext()) løkke traver gennem alle <element>.
I maven på løkken cloner jeg current, så jeg ikke fucker løkken up.

Nu er det så at jeg rigtig gerne ville have mulighed for at bruge XPath til at maske de forskellige værdier indenfor et enkelt element ud.

Jeg kan godt køre rundt med min XPathNavigator med MoveToFirstChild(), MoveToNext(), moveToParent() og den slags ... men jeg kan bare ikke være sikker på
at data1, data2 og data3 altid kommer i samme rækkefølge, at de altid er der allesammen og den slags. Derfor ville det være noget
mere robust, hvis jeg kunne skrive noget i retning af getValueAt("./data2") eller getAttributeValue("//data3[@yada]","yada") eller noget i den stil.

Jeg har i øvrigt IKKE adgang til at skrive id'er i de forskellige felter, så løsningen kan ikke involvere MoveToId() ... well ikke på en simpel form i hvert fald :-?

Er der nogen af jer der har en løsning til hvordan jeg kan få XPath adgang gennem mit (/mine?) XPathNavigator objekter? Jeg er temmelig desperat her! :-(
/o-zone

P.S. Hvis I gerne vil se min kode, så skriv endelig!
Avatar billede superzapper Nybegynder
12. december 2006 - 17:55 #1
Hvis du står på element og skal finde data2 kan du bare skrive "data2" som udtryk.
Står du derimod på root og vil hente alle skriver du "element/data2" som udtryk.
Det burde være helt lige til.

Skal du bruge en liste over XPath udtryk har jeg en lille artikel her du kan se:
http://dotnetnerd.dk/articles/xpath.aspx

Håber det hjælper ellers må du smide lidt kode...
Avatar billede superzapper Nybegynder
12. december 2006 - 17:58 #2
PS. Du skal bruge select metoderne på XPathNavigator...
Avatar billede superzapper Nybegynder
12. december 2006 - 18:05 #3
Avatar billede kalp Novice
12. december 2006 - 20:21 #4
hmm... jeg bruger XPath, men ikke XPathNavigator..
bare en normal XMLDocument..

og der kan du vist bare skriv

XMLDocument.GetElementsByTagName("data1");

så har du alle data1.

men ellers kan det gøres dynamisk noget i stil med


XmlNode elementList = XmlNode.SelectNodes("/root/element/");

foreach(XmlNode element in elementList)
{
XmlNode data = element.SelectSingleNode("./data1");
// evt printe data'en ud af den via. data.InnerText.
}
Avatar billede segato Nybegynder
13. december 2006 - 12:05 #5
Det kan du gøre alene med XPATH.

descendant::*[local-name()='pict']

descendant betyder at den kun skal kigge i sin egen node og nedefter. Ovenstående sætning siger f.eks. fin alle pict noder, men kun i den node som denne Select bliver udført på.
Avatar billede o-zone Nybegynder
13. december 2006 - 15:24 #6
superzapper: det var vist mere et C# spørgsmål end et XPath spørgsmål. Men det er en fin artikel du har henvist til, hvis man har problemer med XPath syntaxen.

til jer andre to - tak for en masse oplysende svar :) ... jeg har pludselig fået travlt med noget andet, så jeg kan ikke teste det af lige med det samme. Men I skal selvfølgelig ikke snydes for point, bare fordi jeg har travlt.

Hvis kalp og segato smider et svar, så kan I alle tre dele pointene :)
- tak for hjælpen!

/o-zone
Avatar billede segato Nybegynder
13. december 2006 - 16:09 #7
Ok, held og lykke med det.
Avatar billede kalp Novice
13. december 2006 - 16:21 #8
kommer her=)
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