Avatar billede nicocarlos Nybegynder
27. januar 2008 - 20:11 Der er 31 kommentarer og
1 løsning

SimpleXMLElement søgning problem

Hej ved ikke lige hvad der sker for eksperten idag, nu har jeg prøvet at oprette dette spørgsmål 3 gange. Og den vil heller ikke søge ordentligt. Men prøver da lige en 4 gang:

Jeg har et XML dokument som jeg vil søge i ved hjælp af php og har prøvet at bruge SimpleXMLElement:

XML:
  <Car Name="Toyota">
    <Segments>
      <Segment ID="Avensis">
        <price>1650000</price>
        <Region>Denmark</Region>
      </Segment>
      <Segment ID="Avensis2">
        <Price>300600</Price>
        <Region>Germany</Region>
      </Segment>
    </Segments>
  </Car>

Prøver så at hente prisen ud på en Avensis2, men det kan ikke lade sig gøre for mig, håber der er en der kan hjælpe. Jeg er ligeglad hvordan det kommer ud bare det kommer ud :D

Der er andre bilmærker.

På forhånd tak
Avatar billede erikjacobsen Ekspert
27. januar 2008 - 20:17 #1
Bruger du PHP4 eller 5?
Avatar billede nicocarlos Nybegynder
27. januar 2008 - 20:19 #2
PHP5, kan man bruge SimpleXMLElement i PHP4?
Avatar billede nielle Nybegynder
27. januar 2008 - 20:19 #3
Prøv med denne XPath:

//Car/Segments/Segment[@Id=Avensis2]/Price
Avatar billede erikjacobsen Ekspert
27. januar 2008 - 20:21 #4
Nej, det kan man vel ikke. Læste det ikke ordentligt - det er bare: jeg vil ikke spilde min tid på PHP4 og XML.

Kan du bruge nielles eller skal du have mere kode?
Avatar billede nicocarlos Nybegynder
27. januar 2008 - 20:26 #5
$result = $xmlData->xpath('//Car/Segments/Segment[@Id=Avensis2]/Price');
print "$result";

Vil ikke rigtig virke for mig, måske gør jeg det forkert, den laver ikke fejl men udskriver heller ikke noget
Avatar billede nicocarlos Nybegynder
27. januar 2008 - 20:27 #6
doh vent lige 1 min tror jeg glemte noget :D
Avatar billede nicocarlos Nybegynder
27. januar 2008 - 20:29 #7
Havde glemt at det faktisk var:
<Companies>
  <Car Name="Toyota">
    <Segments>
      <Segment ID="Avensis">
        <price>1650000</price>
        <Region>Denmark</Region>
      </Segment>
      <Segment ID="Avensis2">
        <Price>300600</Price>
        <Region>Germany</Region>
      </Segment>
    </Segments>
  </Car>
</Companies>

xpath('//Companies/Car/Segments/Segment[@Id=Avensis2]/Price');

virker heller ikke :/
Avatar billede nielle Nybegynder
27. januar 2008 - 20:31 #8
Du skal ikke printe $result - det er jo selve noden. Du skal have fat på dens innertext.
Avatar billede nicocarlos Nybegynder
27. januar 2008 - 20:35 #9
Hmm den er jeg ikke helt med, hvorfor er Price med i enden hvis den ikke skal printe prisen? Tror måske ikke jeg er helt med på den Xpath
Avatar billede nicocarlos Nybegynder
27. januar 2008 - 20:40 #10
Hvordan får jeg så fat i prisen?
Avatar billede erikjacobsen Ekspert
27. januar 2008 - 20:40 #11
Hvis du nu ville stave enten price eller Price ...

http://n0p.com/816775.php ligger koden

<?php

    $dom = new DOMDocument();
    $dom->load("816775.xml");
    $xpath = new DOMXPath($dom);
    $query = '//Car/Segments/Segment[@ID="Avensis2"]/Price';
    $entries = $xpath->evaluate($query, $dom);
    for ($i = 0; $i < $entries->length; $i++) {
      print_r( $entries->item($i)->nodeValue) . "\n";
    }
?>

og XML-filen er http://n0p.com/816775.xml. Scriptet giver:

300600
Avatar billede erikjacobsen Ekspert
27. januar 2008 - 20:41 #12
Og man kan bare sige print i stedet for print_r - jeg fik klippe/klistret lidt forkert ;)
Avatar billede nielle Nybegynder
27. januar 2008 - 20:44 #13
Det inkonsistent stavese price/Price har vist kun betydnig hvis man forsøger at finde den første Avensis. :^)

Derimod tror jeg mere på den lille variation med at indsætte "-tegn rundt om attribut-værdien:

'//Car/Segments/Segment[@ID="Avensis2"]/Price'
Avatar billede nicocarlos Nybegynder
27. januar 2008 - 20:45 #14
Ahh ja det ser ud til at virke, jeg kan se du bruger DOMdocument. Hvad er forskellen på det og så SimpleXMLElement?

Der vil altid kun være en der hedder "Avensis", behøver man så lave en for lykke?

Tak
Avatar billede nicocarlos Nybegynder
27. januar 2008 - 20:47 #15
Ja Price/price var lige en lige fejl, det har jeg rettet :/
Avatar billede nielle Nybegynder
27. januar 2008 - 20:47 #16
Hvis der altid *er* *netop* een kan det selvfølgeligt gøres uden en løkke:

print_r($entries->item(0)->nodeValue) . "\n";
Avatar billede erikjacobsen Ekspert
27. januar 2008 - 20:48 #17
Og hemmeligheden er at en xpath-forespørgsel returnerer en nodelist - også selv om der kun er eet svar.
Avatar billede nicocarlos Nybegynder
27. januar 2008 - 20:49 #18
Tak, er der en stor forskel på SimpleXMLElement og DOMDocument?

Vil i dele point eller hvordan ? :D

Takker
Avatar billede olebole Juniormester
27. januar 2008 - 20:50 #19
<ole>

I simpleXml:

$xml = <<<XML
<Companies>
  <Car Name="Toyota">
    <Segments>
      <Segment ID="Avensis">
        <Price>1650000</Price>
        <Region>Denmark</Region>
      </Segment>
      <Segment ID="Avensis2">
        <Price>300600</Price>
        <Region>Germany</Region>
      </Segment>
    </Segments>
  </Car>
</Companies>
XML;

$xmlData = new SimpleXMLElement($xml);

$elm = $xmlData->xpath("//Car/Segments/Segment[@ID='Avensis2']/Price");
print $elm[0];

/mvh
</bole>
Avatar billede olebole Juniormester
27. januar 2008 - 20:51 #20
DOMDocument ligner langt mere 'rigtig' XML  :)
Avatar billede erikjacobsen Ekspert
27. januar 2008 - 20:51 #21
Jeg kunne ikke lige finde mine eksempler med SimpleXMLElement, nok fordi jeg hellere vil bruge DOMDocument, som ligner noget jeg bruger andre steder, men nej, der er vist ingen grundlæggende forskel.

Lad os lige lege lidt:

http://n0p.com/816775a.php indholder

<?php

    $dom = new DOMDocument();
    $dom->load("816775.xml");
    $xpath = new DOMXPath($dom);
    $query = '//Car/Segments/Segment/Price';
    $entries = $xpath->evaluate($query, $dom);
    for ($i = 0; $i < $entries->length; $i++) {
      print $entries->item($i)->nodeValue . "<br>";
    }
?>

og gæt hvad den skriver ud ...
Avatar billede nicocarlos Nybegynder
27. januar 2008 - 20:52 #22
Tak olebole, den tror jeg faktisk, jeg bruger har nemlig mest rodet med det SimpleXMLElement. Men er der noget forskel på belastning på server fra det ene til det andet hvis det kører ofte?
Avatar billede nicocarlos Nybegynder
27. januar 2008 - 20:53 #23
Hehe den udskriver vel begge fordi du ikke har angivet hvilken en du ønsker :D (og har en lykke)
Avatar billede erikjacobsen Ekspert
27. januar 2008 - 20:56 #24
Ja, det er ren lykke. Men du har ret: løkken udskriver begge priser (som jeg har skrevet som Price begge steder). Jeg ved ikke hvilken der er effektiverest...

Ingen point til mig, tak.
Avatar billede nielle Nybegynder
27. januar 2008 - 21:00 #25
... men ja: Det gør en væenstlig forskel om man skriver:

"//Car/Segments/Segment[@ID=Avensis2]/Price"

eller:

"//Car/Segments/Segment[@ID='Avensis2']/Price"


:^)
Avatar billede nicocarlos Nybegynder
27. januar 2008 - 21:01 #26
Smid nogle svar, dem der vil have lidt point :D

ok erikjacobsen, mange tak for hjælpen
Avatar billede nielle Nybegynder
27. januar 2008 - 21:03 #27
Springer over på denne her :^)
Avatar billede nicocarlos Nybegynder
27. januar 2008 - 21:09 #28
Hehe, nå men mange tak :D

Olebole?
Avatar billede olebole Juniormester
27. januar 2008 - 22:18 #29
njøøhhh ... jeg udpindede vel bare lidt småting, der allerede var skrevet. Ellers tak. Hvis ingen af de andre vil have, så må du selv acceptere  :)
Avatar billede olebole Juniormester
27. januar 2008 - 22:35 #30
- og hvad der er hurtigst, ved jeg ikke, men du kunne jo prøve at teste en query 1000 gange eller flere med begge metoder og sammenligne.

NB: Husk at lave flere test, inden du konkluderer noget. Mange ting kan gøre en forskel ... f.eks. 'dybden' af forespørgslen (hvor mange niveauer af elementer/sub-elementer der skal kaldes ned i).

En artikel på quirksmode.org har således konkluderet, at innerHTML er dramatisk hurtigere end DOM ved dynamisk indsættelse af HTML-elementer i browseren. Det har bevirket at andre citterer den pågældende artikel, mens andre igen citterer nogen, der citterer en eller anden, der citterer artiklen fra quirksmode.org - og måske endda uden kildehenvisning. I mellemtiden er det gået hen og blevet en nagelfast sandhed, at innerHTML helt ubestrideligt er langt hurtigere end DOM. Man er en nar, hvis man påstår noget andet!

Skulle nogen være udstyret med en glubsk nørdekirtel og have lyst til at se mig ryste min bebjældede hat, forsøger jeg at prikke lidt til myten her:
    http://www.dengodekode.dk/artikler/DOM/no_innerhtml.php

- et meget godt eksempel på, det betaler sig at lave mange, forskellige test  ;o)
Avatar billede olebole Juniormester
27. januar 2008 - 22:38 #31
- og det nøjagtige link til performance diskutionen er:
    http://www.dengodekode.dk/artikler/DOM/no_innerhtml.php#innerhtml_performance
Avatar billede nicocarlos Nybegynder
28. marts 2008 - 00:45 #32
Lukker
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