Avatar billede bandersen2200 Nybegynder
17. juli 2011 - 19:23 Der er 22 kommentarer og
1 løsning

PHP Læse XML fil fra URL

Hej

Jeg prøver at læse XML teksten fra følgende adresse: http://www.labs.skanetrafiken.se/v2.2/resultspage.asp?cmdaction=next&selPointFr=|81080|0&selPointTo=|10003|0&LastStart=2011-09-12%2007:30

Fra XML filen vil jeg gerne læse alle DepDateTime

Jeg har forsøgt at bruge eksemplet som arne_v har vist i følgende tråd: http://www.eksperten.dk/spm/827984

Min kode ser ud som følgende:

<?php
$doc = domxml_open_file('http://www.labs.skanetrafiken.se/v2.2/resultspage.asp?cmdaction=next&selPointFr=|81080|0&selPointTo=|10003|0&LastStart=2011-09-12%2007:30');
$list = $doc->get_elements_by_tagname('Envelope');
foreach($list as $detail) {
    echo 'DetailsUrl = ' . $detail->get_attribute('url') . '<br>';
    $node = $detail->first_child();
    do {
        if($node->node_name() == 'DepDateTime') {
            foreach($detail->get_elements_by_tagname('DepDateTime') as $DepDateTime) {
                $authortext = $DepDateTime->first_child();
                echo 'DepDateTime = ' . $authortext->node_value() . '<br>';
            }
        }
        $node = $node->next_sibling();
    } while($node != NULL);
    echo '====<br>';
}
?>

Jeg får følgende fejl når jeg kører scriptet: Fatal error: Call to undefined function domxml_open_file() in C:\xampp\htdocs\RejseplanenSverige\test.php on line 2

Håber i kan hjælpe.
Avatar billede arne_v Ekspert
17. juli 2011 - 19:58 #1
Der der er PHP 4 kode.

Hvis du er paa PHP 5 skal du lave det som man goer i PHP 5.
Avatar billede bandersen2200 Nybegynder
17. juli 2011 - 20:14 #2
Okay er det muligt at få et eksempel på dette ? Med samme metode ?
Avatar billede bandersen2200 Nybegynder
17. juli 2011 - 20:18 #3
Jeg går udfra jeg skal bruge følgende: $xml = new SimpleXMLElement('http://www.labs.skanetrafiken.se/v2.2/resultspage.asp?cmdaction=next&selPointFr=|81080|0&selPointTo=|10003|0&LastStart=2011-09-12%2007:30');

Men hvordan henter jeg så værdien ud for: DepDateTime ?
Avatar billede arne_v Ekspert
17. juli 2011 - 20:18 #4
Jeg har ihvertfald koden der fra 2008 i PHP 5 version:

<?php
$doc = new DOMDocument();
$doc->preserveWhiteSpace = FALSE;
$doc->load('http://xml-eu.amazon.com/onca/xml3?KeywordSearch=genes&dev-t=D2WMCOIPS9D14E&f=xml&locale=uk&mode=books&page=1&t=chipdir03&type=lite');
$list = $doc->getElementsByTagName('Details');
foreach($list as $detail) {
    echo 'DetailsUrl = ' . $detail->attributes->getNamedItem('url')->nodeValue . '<br>';
    $node = $detail->firstChild;
    do {
        if($node->nodeName == 'Authors') {
            foreach($detail->getElementsByTagName('Author') as $author) {
                echo 'Author = ' . $author->nodeValue . '<br>';
            }
        } else if($node->nodeName == "ProductName") {
            echo 'ProductName = ' . $node->nodeValue . '<br>';
        } else if($node->nodeName == "UsedPrice") {
            echo 'UsedPrice = ' . $node->nodeValue . '<br>';
        } else if($node->nodeName == "ImageUrlSmall") {
            echo 'ImageUrlSmall = ' . $node->nodeValue . '<br>';
        }
        $node = $node->nextSibling;
    } while($node != NULL);
    echo '====<br>';
}
?>
Avatar billede arne_v Ekspert
17. juli 2011 - 20:23 #5
Du kan ogsaa bruge SimpleXml.

http://www.eksperten.dk/guide/1263 beskriver nogle af de forskellige maader man kan tilgaa XML paa i PHP.
Avatar billede bandersen2200 Nybegynder
17. juli 2011 - 20:32 #6
Hej Arne

Tak for det. Men modtager stadig en fejl. Har ændret din kode til følgende:

<?php
$doc = new DOMDocument();
$doc->preserveWhiteSpace = FALSE;
$doc->load('http://www.labs.skanetrafiken.se/v2.2/resultspage.asp?cmdaction=next&selPointFr=|81080|0&selPointTo=|10003|0&LastStart=2011-09-12%2007:30');
$list = $doc->getElementsByTagName('Journeys');
foreach($list as $detail) {
    echo 'DetailsUrl = ' . $detail->attributes->getNamedItem('url')->nodeValue . '<br>';
    $node = $detail->firstChild;
    do {
        if($node->nodeName == 'DepDateTime') {
            foreach($detail->getElementsByTagName('DepDateTime') as $DepDateTime) {
                echo 'DepDateTime = ' . $DepDateTime->nodeValue . '<br>';
            }
        }
        $node = $node->nextSibling;
    } while($node != NULL);
    echo '====<br>';
}

?>

Også får jeg følgende fejl:

Warning: DOMDocument::load(http://www.labs.skanetrafiken.se/v2.2/resultspage.asp?cmdaction=next&selPointFr=%7C81080%7C0&selPointTo=%7C10003%7C0&LastStart=2011-09-12%252007:30) [domdocument.load]: failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error in C:\xampp\htdocs\RejseplanenSverige\test.php on line 4

Warning: DOMDocument::load() [domdocument.load]: I/O warning : failed to load external entity "http://www.labs.skanetrafiken.se/v2.2/resultspage.asp?cmdaction=next&selPointFr=%7C81080%7C0&selPointTo=%7C10003%7C0&LastStart=2011-09-12%252007:30" in C:\xampp\htdocs\RejseplanenSverige\test.php on line 4


Linje 4 er "$doc->load('..."

Hvorfor kan den ikke loades ?
Avatar billede bandersen2200 Nybegynder
17. juli 2011 - 20:44 #7
Jeg har prøvet at følge din vejledning med SimpleXML. Men jeg kan ikke få den til at udskrive de rigtige parametre:

<?php
// opret simple struktur og indlæs XML fil
$xml = new SimpleXMLElement(file_get_contents('http://www.labs.skanetrafiken.se/v2.2/resultspage.asp?cmdaction=next&selPointFr=|81080|0&selPointTo=|10003|0&LastStart=2011-09-12%2007:30'));
// find alle medlem elementer
foreach($xml->Journey as $Journey) {
    echo "<tr>\r\n";
    // find og udskriv sub element navn
    echo "<td>" . $Journey->DepDateTime . "</td>\r\n";
    // find og udskriv sub element adresse
    echo "<td>" . $Journey->ArrDateTime . "</td>\r\n";
    echo "</tr>\r\n";
}
?>
Avatar billede arne_v Ekspert
17. juli 2011 - 20:55 #8
Hvordan ser XML ud og hvad vil du have udskrevet?
Avatar billede bandersen2200 Nybegynder
17. juli 2011 - 21:10 #9
På følgende link kan du se XML filen: http://www.labs.skanetrafiken.se/v2.2/resultspage.asp?cmdaction=next&selPointFr=|81080|0&selPointTo=|10002|0&LastStart=2011-09-12%2007:30

Jeg vil gerne have DepDateTime og ArrDateTime for hver Journey.

Opbygningen er som følgende:

<soap:Envelope>
<soap:Body>
<GetJourneyResponse>
<GetJourneyResult>
<Code>0</Code>
<Message/>
<JourneyResultKey>0194162221071728245141489</JourneyResultKey>
<Journeys>
<Journey>
<SequenceNo>0</SequenceNo>
<DepDateTime>2011-09-12T07:46:00</DepDateTime>
<ArrDateTime>2011-09-12T10:13:00</ArrDateTime>

Mvh
Benjamin
Avatar billede arne_v Ekspert
17. juli 2011 - 22:28 #10
Det ligner noget SOAP XML - lad mig lige proeve at tygge paa det.
Avatar billede arne_v Ekspert
17. juli 2011 - 22:37 #11
<?php
$doc = new DOMDocument();
$doc->preserveWhiteSpace = FALSE;
//$doc->load('http://www.labs.skanetrafiken.se/v2.2/resultspage.asp?cmdaction=next&selPointFr=|81080|0&selPointTo=|10002|0&LastStart=2011-09-12%2007:30');
$doc->load('somesoap.xml');
$list = $doc->getElementsByTagName('Journey');
foreach($list as $journey) {
    foreach($journey->childNodes as $elm) {
        if($elm->nodeName == "DepDateTime") {
            echo 'Afgang: ' . $elm->nodeValue . "\r\n";
        } else if($elm->nodeName == "ArrDateTime") {
            echo 'Ankomst: ' . $elm->nodeValue . "\r\n";
        }
    }
}
?>
Avatar billede bandersen2200 Nybegynder
17. juli 2011 - 23:53 #12
Hej Arne 1000 tak for eksemplet men jeg kan ikke få det til at virke. Foreach kommer den aldrig ind i også har jeg tilføjet file_get_contents() til URL strengen ellers fik jeg fejl. Følgende kode udskriver kun "Outside foreach !" og ikke "Inside foreach !!"

<?php
$doc = new DOMDocument();
$doc->preserveWhiteSpace = FALSE;
$doc->load(file_get_contents('http://www.labs.skanetrafiken.se/v2.2/resultspage.asp?cmdaction=next&selPointFr=|81080|0&selPointTo=|10002|0&LastStart=2011-09-12%2007:30 '));
//$doc->load('sverige.xml');
$list = $doc->getElementsByTagName('Journey');
echo "Outside foreach !";
foreach($list as $journey) {
echo "Inside foreach !!";
    foreach($journey->childNodes as $elm) {
        if($elm->nodeName == "DepDateTime") {
            echo 'Afgang: ' . $elm->nodeValue . "\r\n";
        } else if($elm->nodeName == "ArrDateTime") {
            echo 'Ankomst: ' . $elm->nodeValue . "\r\n";
        }
    }
}
?>

Mvh
Benjamin
Avatar billede arne_v Ekspert
18. juli 2011 - 00:01 #13
Mystisk - det virker nemlig hos mig - dog kun hvis jeg henter fil med browser.
Avatar billede bandersen2200 Nybegynder
18. juli 2011 - 00:06 #14
Altså hvis du henter filen også gemmer den lokalt ?
Avatar billede bandersen2200 Nybegynder
18. juli 2011 - 00:09 #15
Kan en løsning være at gemme hver XML fil også læse den lokalt ?
Avatar billede arne_v Ekspert
18. juli 2011 - 00:21 #16
ja
Avatar billede arne_v Ekspert
18. juli 2011 - 00:21 #17
nej

jeg tror at du skal finde ud af hvorfor det nogen gange gaar galt med at hente den XML
Avatar billede bandersen2200 Nybegynder
18. juli 2011 - 18:01 #18
Hej Arne

Hvorfor tror du det nogle gange går galt med at hente den ? Nu har jeg tilføjet det samme eksempel som de har på deres hjemmeside:

http://www.labs.skanetrafiken.se/v2.2/resultspage.asp?cmdaction=next&selPointFr=malm%F6%20C|80000|0&selPointTo=landskrona|82000|0&LastStart=2011-07-18%2016:38

Og den er der ikke fejl i når man bruger browseren. Eksemplet er hentet fra Sveriges Trafikken API: http://www.labs.skanetrafiken.se/api.asp Under Metode: Resultspage.

Hvordan skal man kontrollere om det går galt ? Try catch metode ?

Mvh
Benjamin
Avatar billede bandersen2200 Nybegynder
18. juli 2011 - 18:21 #19
Jeg tror der er problemer med konverteringen til DOMDocument. Når jeg fjerner file_get_contents() på strengen jeg prøver at hente, får jeg følgende Warnings:

Warning: DOMDocument::load(http://www.labs.skanetrafiken.se/v2.2/resultspage.asp?cmdaction=next&selPointFr=malm%25F6%2520C%7C80000%7C0&selPointTo=

landskrona%7C82000%7C0&LastStart=2011-07-18%252016:38)

[domdocument.load]: failed to open stream: HTTP request failed!

HTTP/1.1 500 Internal Server Error in C:\xampp\htdocs\RejseplanenSverige\SimpleXMLSverige.php on line 6

Så HTTP request failed, men hvordan kommer jeg videre her fra ? Nogen der har en alternativ måde at gøre dette på ?

Point er forøget til 60 for en løsning.
Avatar billede bandersen2200 Nybegynder
18. juli 2011 - 20:09 #20
Hej igen, hvis du kører følgende kode kan du se at der kommer den forventede data fra siden. Det skal blot konverteres til XML format. Det sker dog ikke korrekt tror jeg ikke, da det ikke er muligt at hente noget fra $xml, den giver følgende fejl:
Notice: Trying to get property of non-object in C:\xampp\htdocs\RejseplanenSverige\SimpleXMLSverige.php on line 22

<?php

$url ='http://www.labs.skanetrafiken.se/v2.2/resultspage.asp?cmdaction=next&selPointFr=malm%F6%20C|80000|0&selPointTo=landskrona|82000|0&LastStart=2011-07-18%2016:38';

$result = file_get_contents($url);
if ($result === false) {
    print 'Error in class file_get_contents($url): $this->_xml Caught exception: ' . $url. "\n";
//    throw new Exception('An error occured while opening url: ' . $url);
}else
{
    // Trim it down.
    $content = trim($result);
    echo "$content: ".$content;
    // Save it to disk, for later use
    if (isset($file)) {
        file_put_contents($file, $content);
    }
    try {
        $xml = new SimpleXMLElement($content);
        $result = array();
        $result[] =$xml->GetJourneyResponse->GetJourneyResult->Journeys->Journey->SequenceNo[0]->DepDateTime;
        print_r($result[0]);
    } catch(Exception $e) {
        print 'Error in class: $this->_xml Caught exception: ' . $e->getMessage() . "\n";
        print "<pre>--SNIP--\n$content\n--/SNIP--</pre>";        }
}
?>
Avatar billede bandersen2200 Nybegynder
18. juli 2011 - 20:40 #21
Hej Arne, jeg har oprettet spørgsmålet på ny : http://www.eksperten.dk/spm/943287

Men jeg skylder vist 30 point så hvis du kan skrive et svar kan du få de 30 point :) Tak for hjælpen.
Avatar billede bandersen2200 Nybegynder
18. juli 2011 - 22:24 #22
Yes fik det endelig til at virke :)

<?php

$url ='http://www.labs.skanetrafiken.se/v2.2/resultspage.asp?cmdaction=next&selPointFr=malm%F6%20C|80000|0&selPointTo=landskrona|82000|0&LastStart=2011-07-28%2016:38';

$result = file_get_contents($url);
if ($result === false) {
    print 'Error in class file_get_contents($url): $this->_xml Caught exception: ' . $url. "\n";
//    throw new Exception('An error occured while opening url: ' . $url);
}
else
{
    // Trim it down.
    $content = trim($result);
    //echo "$content: ".$content;
    try {
        $xml = new SimpleXMLElement($content);
       
    } catch(Exception $e) {
        print 'Error in class: $this->_xml Caught exception: ' . $e->getMessage() . "\n";
        print "<pre>--SNIP--\n$content\n--/SNIP--</pre>";        }
       
        // Create new DomDocumetn object
$dom = new DOMDOcument();

// Load your XML as a string
$dom->loadXML($content);

$list = $dom->getElementsByTagName('Journey');
foreach($list as $detail) {   
    $node = $detail->firstChild;
    do {
        if($node->nodeName == 'DepDateTime') {
            foreach($detail->getElementsByTagName('DepDateTime') as $DepDateTime) {
                echo 'DepDateTime = ' . $DepDateTime->nodeValue . '<br>';
            }
        }
        $node = $node->nextSibling;
    } while($node != NULL);
    echo '====<br>';
    }
//echo $dom->saveXML();

}
?>
Avatar billede arne_v Ekspert
19. juli 2011 - 04:00 #23
svar
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