Avatar billede hlt Mester
21. januar 2005 - 12:26 Der er 16 kommentarer og
1 løsning

Hente værdier ud af XML

Hej
Er der nogen der kan sige hvordan man henter værdier ud af et xml dokument. Jeg henter et dokument via Microsoft.XMLHTTP. Hele dette dokument bliver så lagt over i en variabel. Nu er problemet så at jeg skal kunne skille de enkelte værdier fra hindanden og der ved vise det på en lidt mere hensigtsmæssig måde end en lang tekst.
Mvh
Henrik
Avatar billede olebole Juniormester
21. januar 2005 - 19:36 #1
<ole>

Du bruger XPath eller XML-DOM - men det er jo ikke til at forklare i enkeltheder i et spørgsmål ... Google is you friend  :)

/mvh
</bole>
Avatar billede hlt Mester
25. januar 2005 - 22:00 #2
Jeg fandt ud af det, men nu har jeg et nyt spørgsmål. Hvordan tæller jeg antal noder i et xml dokument. Jeg har prøvet med xmlDoc.documentElement.childNodes.length men der viker det som om det er det forkerte antal der kommer ud. Jeg ved at mit xml dok indeholder over 1000 elementer, men denne funktion returnere kun 42. Hvad går galt?
Mvh
Henrik
Avatar billede hlt Mester
25. januar 2005 - 22:01 #3
Egentlig har jeg bare brug for at søge et xml dokument igennem for en bestemt værdi. Er der nogen der kan hjælpe med det?
Mvh
Henrik
Avatar billede olebole Juniormester
26. januar 2005 - 01:11 #4
Hvis 'xmlDoc.documentElement.childNodes.length' returnerer 42, så *har* du kun 42 elementer i dit documentElement. Tror du noget andet, er det nok fordi, du ikke forstår XML ... og den forståelse kan du ikke opnå i et E-spm  :)
Med den smule, du oplyser, er det næsten umuligt at hjælpe
Avatar billede hlt Mester
26. januar 2005 - 09:57 #5
Tak for dit svar. Jeg ved ikke rigtigt om jeg skal grine eller græde over det du skriver. Jeg har aldrig skrevet at jeg var ekspert på området. Så havde jeg såmænd nok ikke oprettet det spørgsmål.;-)
Nå men hvis du vil se koden kommer den her:
<script type="text/javascript" for="window" event="onload" >
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load("mobil.xml");
alert(xmlDoc.documentElement.childNodes.length);
Det jeg har brug for på den ene eller den anden måde at at søge hele dokumentet igennem for en værdi. Og hvis den værdi findes skal der udskrives noget tekst.
Kan det lade sig gøre?
Mvh
Henrik
Avatar billede roenving Novice
26. januar 2005 - 23:26 #6
Men de childnodes er jo kun umiddelbare childs af documentElement, hvis dine værdier er nestet ind i en træstruktur (som f.eks. din harddisk er !-), vil de øvrige elementer ligge i underliggende strukturer ...
Avatar billede hlt Mester
26. januar 2005 - 23:39 #7
Mit xml ser sådan ud:
<feed type="order">
  <category name="test">
    <info>
      <id>20489</id>
      <name>Henrik</name>
      <adress>test</adress>
      <zip>0000</zip>
      <telefone>any</telefone>
      <country>DK</country>
      </info>
<feed type="order">
<category name="test">
Har du eventuelt et bud på hvordan jeg kan søge hele dokumentet igennem for om f.eks Henrik findes i et af name tagets værdier
Jeg har prøvet lidt forskelligt. Det sidste jeg er ude er noget i den stil her

var msgobj=xmlDoc.getElementsByTagName("info")[0]
for(i=0;i<msgobj.childNodes.length;i++)
    {
    if (msgobj.childNodes[i].nodeValue)=="Henrik")
        {
                Udskriv alt tekst til skærm vedrørende info om denne person
                }
      }
Men ovenstående giver giver en fejl
Kan dette overhovedet lade sig gøre?
Mvh
Henrik
Avatar billede roenving Novice
26. januar 2005 - 23:49 #8
Kender du finiteten er det ikke noget problem, men hvis elementer kan indeholde andre elementer, kan det være et problem ...

-- jeg ville tænke i en rekursiv funktion, som fandt name-elementer, og udskrev indholdet af dets parent-elements childNodes !-)
Avatar billede olebole Juniormester
27. januar 2005 - 07:35 #9
Det er ikke valid XML, du har skrevet. Til en start skal du have en XML-prolog og derefter et documentElement - f.eks:

<?xml version="1.0" encoding="iso-8859-1"?>
<dataset>

</dataset>

- derefter kan du fylde elementer i, men det er meget vigtigt, de er korrekt nestede:

<?xml version="1.0" encoding="iso-8859-1"?>
<dataset>
<feed type="order">
  <category name="test">
    <info>
      <id>20489</id>
      <name>Henrik</name>
      <adress>test</adress>
      <zip>0000</zip>
      <telefone>any</telefone>
      <country>DK</country>
    </info>
  </category>
</feed>

<feed type="order">
  <category name="test">
    <info>
      <id>20490</id>
      <name>Børge</name>
      <adress>test</adress>
      <zip>0001</zip>
      <telefone>same here</telefone>
      <country>DK</country>
    </info>
  </category>
</feed>

<feed type="order">
  <category name="test">
    <info>
      <id>20491</id>
      <name>Henrik</name>
      <adress>test</adress>
      <zip>0002</zip>
      <telefone>another one</telefone>
      <country>DK</country>
    </info>
  </category>
</feed>
</dataset>

- så har dit XML-dokument et documentElement med tagName 'dataset'. Dette element har tre child-elementer.
Med den struktur, jeg har brugt her, kan du finde noderne på denne måde:

<script type="text/javascript" for="window" event="onload" >
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false";
xmlDoc.load("mobil.xml");

var a = xmlDoc.selectNodes("/dataset/feed[category/info/name='Henrik']");
var s = "";
for (i=0; i<a.length; i++) {
    s += "Navn: " + a[i].selectSingleNode("category/info/name").text + "\n";
    s += "Postnummer: " + a[i].selectSingleNode("category/info/zip").text + "\n";
    s += "Telefon: " + a[i].selectSingleNode("category/info/telefone").text + "\n";
    s += "------------------------------\n";
}
alert(s)
</script>

Det er den metode, der kaldes XPath. Du kan evt læse mere her:
  http://www.w3schools.com/xpath/default.asp
- og ikke mindst her:
  http://www.w3schools.com/xpath/xpath_syntax.asp

Du kan altid teste, om dit XML-dokument er korrekt ved at trække det ind i et browservindue - eller kalde det i en browser. Er dokumentet ikke iorden, vil du få en XML-fejl.
Avatar billede olebole Juniormester
27. januar 2005 - 07:37 #10
... det virker dog som en lidt besynderlig XML-struktur - men det er svært at udtale sig om, når man ikke ved præcist, hvad du skal bruge det til og hvordan.
Avatar billede hlt Mester
27. januar 2005 - 09:22 #11
Hej
Tak for jers svar. Du har ret i at det ikke er hele XML dokumentet der står. Jeg skrev ikke denne linie <?xml version="1.0" encoding="UTF-8"?>
Jeg har lige prøvet dit script, og det virker lige efter hensigten. Man begynder jo at holde af XML ;-)
Jeg har dog et lille spørgsmål mere. Vil det sige at hvis jeg har en struktur der ser sådan ud:

<?xml version="1.0" encoding="iso-8859-1"?>
<dataset>
<feed type="order">
  <category name="test">
    <info>
      <id>20489</id>
      <name>Henrik</name>
      <adress>test</adress>
      <zip>0000</zip>
      <telefone>any</telefone>
      <country>DK</country>
    </info>
    <info>
      <id>20491</id>
      <name>Henrik</name>
      <adress>test</adress>
      <zip>0002</zip>
      <telefone>another one</telefone>
      <country>DK</country>
    </info>
  </category>
</feed>
</dataset>
Kan jeg skal koden se sådan ud:
var a = xmlDoc.selectNodes("/dataset/feed/category[info/name='Henrik']");
var s = "";
for (i=0; i<a.length; i++) {
    s += "Navn: " + a[i].selectSingleNode("info/name").text + "\n";
    s += "Postnummer: " + a[i].selectSingleNode("info/zip").text + "\n";
    s += "Telefon: " + a[i].selectSingleNode("info/telefone").text + "\n";
    s += "------------------------------\n";
}
alert(s)
Avatar billede olebole Juniormester
27. januar 2005 - 09:55 #12
Næsten  :)
  var a = xmlDoc.selectNodes("/dataset/feed/category/info[name='Henrik']");
Avatar billede hlt Mester
27. januar 2005 - 11:25 #13
jeg takker endnu engang.
Kan der være problemer med at hente data ved stor dokumenter? Koden virker ikke når jeg indlæser hele dokumentet, men hvis jeg korter det ned til f.eks 3 poster så virker det.
Avatar billede hlt Mester
27. januar 2005 - 11:48 #14
Fandt fejlen. fejlen ligger i denne line<?xml version="1.0" encoding="UTF-8"?>
vis jeg sætter denne linie ind istedet for<?xml version="1.0" encoding="iso-8859-1"?>
så virker det. Jeg ved at det er noget med tegnsætning, men hvad præcis er forskellen?
Avatar billede hlt Mester
27. januar 2005 - 13:04 #15
Hej igen
Nu har jeg været inde og læse lidt om xpath. Men jeg synes ikke at jeg kan finde svar på om man kan indsætte en form for wild card i sin søgning. Altså noget med *Henrik* Så der kommer flere resultater frem. ved du om det kan lade sig gøre? Du skal iøvrigt lige smide mig et svar så du kan point.
Tak for hjælpen.
Mvh
Henrik
Avatar billede hlt Mester
30. januar 2005 - 16:34 #16
Hej igen
Er der en måde hvorpå man kan køre denne xml søgning uden at siden låser mens søgningen står på? Der går ca.5 sekunder hvor man ingenting kan foretage sig.
Mvh
Henrik
Avatar billede hlt Mester
18. august 2010 - 12:58 #17
Det er vist på tide at lukke denne 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
Vi tilbyder markedets bedste kurser inden for webudvikling

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