Avatar billede Counx Nybegynder
07. januar 2012 - 22:19 Der er 27 kommentarer og
1 løsning

Hent specifik data i XML fil

Godaften, har kigget lidt rundt og har ikke kunne finde noget om at hente specifik data i xml fil til en hjemmeside.

Da jeg ikke rigtig har arbejdet med XML filer før, vil jeg forklare hvad jeg godt kunne tænke mig, uden så meget fagsprog. :)

Det ser sådan ud at jeg arbejder med at lave en hjemmeside i ASP.NET og skal lave en table hvor jeg skal hente data som har bestemt value i row.
Eks.
<Vare>
<Kategori></Kategori>
<VareNavn></VareNavn>
<VarePris></VarePris>
<Beskrivelse></Beskrivelse>
<Billede></Billede>
</Vare>
Så vil jer gerne gøre så at jeg kun henter de rows som har kategori 2 og ikke viser alle de andre rows hvor kategori har værdi 1, 3, 4 osv.

Jeg bruger et script til at hente data med, det er det fra W3, hvis nogle kender det.

<script type="text/javascript">
    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    }
    else {// code for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.open("GET", "webshop.xml", false);
    xmlhttp.send();
    xmlDoc = xmlhttp.responseXML;

   
   
    document.write("<table class=TableCSS>");
    document.write("<th class=TableHeader>Kategori</th>");
    document.write("<th class=TableHeader>Varenavn</th>");
    document.write("<th class=TableHeader>Pris</th>");
    var x = xmlDoc.getElementsByTagName("Vare");
    for (i = 0; i < x.length; i++) {
        document.write("<tr>");
        document.write("</td><td class=TableData>");
        document.write(x[i].getElementsByTagName("Kategori")[0].childNodes[0].nodeValue);
        document.write("</td><td class=TableData>");
        document.write(x[i].getElementsByTagName("VareNavn")[0].childNodes[0].nodeValue);
        document.write('</td><td align="right" class=TableData>')
        document.write(x[i].getElementsByTagName("VarePris")[0].childNodes[0].nodeValue);
        document.write(',-');
        document.write("</td></tr>");
    }
    document.write("</table>");
</script>

Jeg vil mene det er her jeg skal rette noget i men, ved ikk om der er en måde hvor jeg kan lave OnlyGetElemtsByTagName eller noget i den stil. :p
Har prøvet at se om jeg kunne lave en datasource og smide den ind i et gridview, men det ser ikke ud til at fungere for mig, nogle som har en måde at ordne dette på?

/// Counx
Avatar billede arne_v Ekspert
07. januar 2012 - 22:21 #1
Du skal bruge XPath!
Avatar billede arne_v Ekspert
07. januar 2012 - 22:23 #2
Jeg kender ikke meget tiL XML i JavaScript, men proev og erstat:

var x = xmlDoc.getElementsByTagName("Vare");

med:

var x = xmlDoc.selectNodes("//Vare[Kategori='2']");
Avatar billede Counx Nybegynder
07. januar 2012 - 22:43 #3
Vil lige prøve at lære XPath så, der ser ikke ud af så meget. :)

Det eksempel du gav virkede desværre ikke, ved ikke om det har noget at gøre med at kategorierne er navne og ikke tal, men det er jo ikke en database med bestemte slags strings så det burde vel være lige meget?
Avatar billede arne_v Ekspert
07. januar 2012 - 22:48 #4
Uden at kende din XML er det svaert at foreslaa en praecis XPath.
Avatar billede Counx Nybegynder
07. januar 2012 - 23:13 #5
Du kan se hvordan den er bygget op med elementerne i toppen i eksempel 1.

Jeg har prøvet at bruge:
var x = xmlDoc.selectNodes("//Kategori[@Bundkort]");

Men det giver ikke rigtig noget resultat, men ser det ud til at jeg er ved at være derhenne af? :)
Avatar billede arne_v Ekspert
07. januar 2012 - 23:46 #6
I det eksempel du har vist er der kun en vare og ingen data.

Jeg tillader mig at formode at det ikke er dine data.
Avatar billede arne_v Ekspert
07. januar 2012 - 23:47 #7
var x = xmlDoc.selectNodes("//Kategori[@Bundkort]");

virker hvis XML ser ud som:

<Kategori Bundkort="noget">de data du vil have</Kategori>
Avatar billede Counx Nybegynder
08. januar 2012 - 00:03 #8
Okay, men kan ikke forstå at der ikke er en nem måde til at selecte nogle rows på. :S
XML opbygning ser sådan her ud:

<Vare>
<Kategori></Kategori>
<VareNavn></VareNavn>
<VarePris></VarePris>
<Beskrivelse></Beskrivelse>
<Billede></Billede>
</Vare>

Jeg skal bare have så at på en side, der kan jeg hente alle de varer som har kategori Bundkort og på en anden side skal jeg kunne hente de varer som har kategori CPU. Men det er jo bare den samme måde det gøres på, hvor der bliver skiftet lidt ud i koden, hvis sådan et stykke kode findes. :S
Problemet er bare det at den skal kun hente de varer som har kategori Bundkort og ikke andet en dette.

Har søgt lidt rundt og set dig på en del tråde hvad angår XML så holder lidt på at du er min guru til det her. :p
Avatar billede arne_v Ekspert
08. januar 2012 - 00:06 #9
var x = xmlDoc.selectNodes("//Vare[Kategori='Bundkort']");

er stadig mit bedste bud
Avatar billede arne_v Ekspert
08. januar 2012 - 00:08 #10
Hvis der er er top element

<AlleVarer)
  <Vare>
  </Vare>
  ...
  <Vare>
  </Vare>
</AlleVarer>

kan du proeve:

var x = xmlDoc.selectNodes("/AlleVarer/Vare[Kategori='Bundkort']");
Avatar billede Counx Nybegynder
08. januar 2012 - 00:11 #11
Det er der ikke og dette eksempel kan jeg heller ikke få til at virke, forstår det ikke helt. :S
Avatar billede arne_v Ekspert
08. januar 2012 - 00:23 #12
Hvis du har flere varer maa der vaere et top element (root element i XML terminologi).
Avatar billede Counx Nybegynder
08. januar 2012 - 00:33 #13
Har set lidt på det nu, opbygningen er:
<Webshop>
  <Vare>
  <Kategori>Adapter</Kategori>
  <VareNavn>USB til Parallel Adapter</VareNavn>
  <VarePris>199</VarePris>
  <Beskrivelse />
  <Billede />
  </Vare>
  <Vare>
  <Kategori>Adapter</Kategori>
  <VareNavn>USB til PS/2 Adapter Mus/tastatur</VareNavn>
  <VarePris>149</VarePris>
  <Beskrivelse />
  <Billede />
  </Vare>
</Webshop>

Vidste ikk at det webshop var med, fordi det hedder filen også. :)
Avatar billede Counx Nybegynder
08. januar 2012 - 00:40 #14
Men har prøvet:
var x = xmlDoc.selectNodes("//Webshop/Vare[Kategori='Bundkort']");
Avatar billede arne_v Ekspert
08. januar 2012 - 02:06 #15
Jeg hader client side JavaScript !!
Avatar billede arne_v Ekspert
08. januar 2012 - 02:07 #16
var x = xmlDoc.selectNodes("/Webshop/Vare[Kategori='Adapter']");   

    for (i = 0; i < x.length; i++) {
        document.write("<tr>");
        document.write("</td><td class=TableData>");
        document.write(x[i].getElementsByTagName("Kategori")[0].childNodes[0].nodeValue);
        document.write("</td><td class=TableData>");
        document.write(x[i].getElementsByTagName("VareNavn")[0].childNodes[0].nodeValue);
        document.write('</td><td align="right" class=TableData>')
        document.write(x[i].getElementsByTagName("VarePris")[0].childNodes[0].nodeValue);
        document.write(',-');
        document.write("</td></tr>");
    }

virker fint i IE !
Avatar billede arne_v Ekspert
08. januar 2012 - 02:07 #17
var it = xmlDoc.evaluate("/Webshop/Vare[Kategori='Adapter']", xmlDoc, null, XPathResult.ANY_TYPE, null);
   
    var curr = it.iterateNext(); // FF 
    while (curr) {
        document.write("<tr>");
        document.write("</td><td class=TableData>");
        document.write(curr.getElementsByTagName("Kategori")[0].childNodes[0].nodeValue);
        document.write("</td><td class=TableData>");
        document.write(curr.getElementsByTagName("VareNavn")[0].childNodes[0].nodeValue);
        document.write('</td><td align="right" class=TableData>')
        document.write(curr.getElementsByTagName("VarePris")[0].childNodes[0].nodeValue);
        document.write(',-');
        document.write("</td></tr>");
        curr = it.iterateNext(); 
    }

virker i FF !
Avatar billede Counx Nybegynder
08. januar 2012 - 14:02 #18
Haha kan jeg så godt forstå. d:
Men hvis nu jeg skal have dem sammen i en eller så at begge kan være på sitet så både IE og FF/Chrome brugere kan se de tables? (:
Kan de føres ind i de if, else statements i toppen af scriptet? (:

Har prøvet at teste dem og de fungere utrolig godt, du har bare styr på det der. Har ikke kunnet finde noget om at det første kun var i IE det kunne bruges, det har jeg så fået at se nu. (:
Avatar billede Counx Nybegynder
08. januar 2012 - 19:49 #19
Forstår nok scriptet og hvorfor det virker i IE, det simpelt lavet, men forstår det ikke rigtig da vi kommer til Chrome/FF scriptet. Det er nok mest det som begrænser mig, men er der ikke en løsning på hvordan det kan fungere i alle browsere?
Avatar billede arne_v Ekspert
08. januar 2012 - 20:50 #20
Du kan teste for om det er IE eller ej (andre browsere undtagen IE boer bruge FF maaden).

Saa vidt jeg kan se er der ikke en faelles maade at goer det paa.
Avatar billede Counx Nybegynder
08. januar 2012 - 20:59 #21
Altså FF metoden virker på mange forskellige browsere hvor den anden kun er IE.
Er der så en måde hvorpå man kan få begge metoder ind i scriptet på? :)
Avatar billede arne_v Ekspert
08. januar 2012 - 21:15 #22
En if else som tester paa browser.
Avatar billede Counx Nybegynder
08. januar 2012 - 21:58 #23
Hvad kan jeg så gøre, lave et:
var isIE = (navigator.appName=="Microsoft Internet Explorer");
var IEversion = navigator.appVersion;
if(isIE) {
var it = xmlDoc.evaluate("//Webshop/Vare[Kategori='Grafikkort']", xmlDoc, null, XPathResult.ANY_TYPE, null);

    var curr = it.iterateNext(); // FF 
    while (curr) {
        document.write("<tr>");
        document.write("</td><td class=TableData>");
        document.write(curr.getElementsByTagName("VareNavn")[0].childNodes[0].nodeValue);
        document.write('</td><td align="right" class=TableData>')
        document.write(curr.getElementsByTagName("VarePris")[0].childNodes[0].nodeValue);
        document.write(',-');
        document.write("</td></tr>");
        curr = it.iterateNext();
    }
} else {
var x = xmlDoc.selectNodes("/Webshop/Vare[Kategori='Adapter']");   

    for (i = 0; i < x.length; i++) {
                document.write("<tr>");
        document.write("</td><td class=TableData>");
        document.write(curr.getElementsByTagName("VareNavn")[0].childNodes[0].nodeValue);
        document.write('</td><td align="right" class=TableData>')
        document.write(curr.getElementsByTagName("VarePris")[0].childNodes[0].nodeValue);
        document.write(',-');
        document.write("</td></tr>");
    }
}

Eller:
<![if IE 7.0]>
Script for IE
<![endif]>
og en for andre browsere
Avatar billede arne_v Ekspert
08. januar 2012 - 22:03 #24
Det foerste.

Bortset fra at du vist har byttet om paa dem.
Avatar billede Counx Nybegynder
08. januar 2012 - 22:04 #25
Ej jeg har ingen ide om hvordan jeg skal detektere IE og smide det script ind og hvis ikke så skal den bruge det andet, men det er nok mere simpelt en jeg lige går og tror, :S
Avatar billede Counx Nybegynder
08. januar 2012 - 23:28 #26
Jeg har fundet ud af det nu, tusinde mange gange tak. :D
hvis du smider et svar, så vil jeg give point. (:
Brugte den første som du sagde, men du får point fordi du har hjulpet mig så meget. :)
Avatar billede arne_v Ekspert
08. januar 2012 - 23:58 #27
svar
Avatar billede Counx Nybegynder
09. januar 2012 - 09:45 #28
Jeg takker. :)
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
Kurser inden for grundlæggende programmering

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