learnMedlem sedan jan. 20051 130 inlägg Jag har en XML som ser ut så här:
<?xml version="1.0" encoding="utf-8"?>
<bookstore>
<books>
<book>
<title>En bok</title>
<chapters>
<chapter>Första kapitlet</chapter>
<chapter>Andra kapitlet</chapter>
</chapters>
</book>
<book>
<title>En annan bok</title>
<chapters>
<chapter>Kapitel 1</chapter>
<chapter>Kapitel 2</chapter>
</chapters>
</book>
</books>
</bookstore>
Jag öppnar och skriver ut från en XML-fil så här:
$xml = simplexml_load_file("books.xml");
echo $xml->books->book[0]->title;
Funkar jättebra men hur kan jag göra för att slippa skriva ut "books->" för varje utskrift?
Jag vill alltså på något sätt kunna välja vart i XML-filen som $xml ska börja (välja "root"). Måste väl gå??
Kanske man kan använda getElementsByTagName('books') på något sätt?
Tack på förhand! :bire
SPiNMedlem sedan mars 20007 896 inlägg ...
$books = $xml->books;
echo $books->book[0]->title;
Det är det närmaste du kommer, eftersom att du fortfarande måste använda en variabel. Möjligtvis kanske du kan få in det i en array förresten;
$books = $xml->books->book;
echo $books[0]->title;
Det är inte en loop du är ute efter?
for($i = 0; $i < count($xml->books->book); $i++) {
echo $xml->books->book[$i]->title;
}
learnMedlem sedan jan. 20051 130 inlägg Tack för ditt svar.
Jo, så småningom är det en loop som är aktuell men jag ville förklara på så enkelt sätt som möjligt. Problemet är att det är så jäkla många nodar att skriva ut (mitt exempel ovan är grovt förenklat. Och dessutom innehåller några av dess namn "otillåtna" tecken, jag får felmeddelande när jag på samma sätt ska skriva ut denna XML:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope>
<soap:Body>
<bookstore>
<books>
<book>
<title>En bok</title>
<chapters>
<chapter>Första kapitlet</chapter>
<chapter>Andra kapitlet</chapter>
</chapters>
</book>
<book>
<title>En annan bok</title>
<chapters>
<chapter>Kapitel 1</chapter>
<chapter>Kapitel 2</chapter>
</chapters>
</book>
</books>
</bookstore>
</soap:Body>
</soap:Envelope>
$xml = simplexml_load_file("books.xml");
echo $xml->soap:Body->bookstore->books->book[0]->title;
Felmeddelande:
Parse error: syntax error, unexpected ':', expecting ',' or ';' in...
learnMedlem sedan jan. 20051 130 inlägg Hur göra?
Bäst vore ju om jag på något sätt kan välja att den, i det här fallet, ska börja läsa på "books"...
Snälla! :)
learnMedlem sedan jan. 20051 130 inlägg Någon som åtminstone vet hur man gör med specialtecknena?
learn skrev:
$xml = simplexml_load_file("books.xml");
echo $xml->soap:Body->bookstore->books->book[0]->title;
Felmeddelande:
Parse error: syntax error, unexpected ':', expecting ',' or ';' in...
Beror inte det där felet på $xml->soap**:**Body-> ...?? (kolon i variabelnamnet !!)
Undra om du inte får encoda alla "specialtecken"?
Jag förstår fortfarande inte exakt vad du vill göra, eller varför du vill slippa "books".
Har du en länk el så till hela xmlflödet?
SPiNMedlem sedan mars 20007 896 inlägg 'soap' är i det här fallet en namnrymd som du får läsa från:
$ns = $xml->children('soap');
echo $ns->Body->bookstore->books->book[0]->title;
Första frågan;
Gick det inte att kopiera arrayen 'book' till en egen array?
$ns = $xml->children('soap');
$myBooks = $ns->Body->bookstore->books->book;
echo $myBooks[0]->title;
learnMedlem sedan jan. 20051 130 inlägg
MickeA.com skrev:
Jag förstår fortfarande inte exakt vad du vill göra, eller varför du vill slippa "books".
Har du en länk el så till hela xmlflödet?
learn skrev:
Problemet är att det är så jäkla många nodar att skriva ut (mitt exempel ovan är grovt förenklat. Och dessutom innehåller några av dess namn "otillåtna" tecken, jag får felmeddelande när jag på samma sätt ska skriva ut denna XML:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope>
<soap:Body>
<bookstore>
<books>
<book>
<title>En bok</title>
<chapters>
<chapter>Första kapitlet</chapter>
<chapter>Andra kapitlet</chapter>
</chapters>
</book>
<book>
<title>En annan bok</title>
<chapters>
<chapter>Kapitel 1</chapter>
<chapter>Kapitel 2</chapter>
</chapters>
</book>
</books>
</bookstore>
</soap:Body>
</soap:Envelope>
$xml = simplexml_load_file("books.xml");
echo $xml->soap:Body->bookstore->books->book[0]->title;
Felmeddelande:
Parse error: syntax error, unexpected ':', expecting ',' or ';' in...
Ja det är ju kolonet i namnet som ställer till det, men det ju så noden heter... Hur ska jag isf encoda, ge mig gärna ett exempel.
Anledningen till att jag vill börja läsa på ett givet ställe i XML:en är helt enkelt att förenkla.
zcorpanMedlem sedan dec. 20042 245 inlägg
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope>
Det här är inte namnrymdsvälformad XML (prefixet är inte definierat), så om det parsas över huvud taget verkar simpleXML sakna stöd för namnrymder... i vilket fall du behöver använda en API som är medveten om namnrymder istället.
SPiNMedlem sedan mars 20007 896 inlägg SimpleXML kan hantera namnrymder. Däremot är det inte optimalt för ändamålet. Och i och med att SOAP är ännu mer komplext så kan det uppstå problem.
$envelope = $xml->children('soap');
$body = $envelope->Envelope->children('soap');
echo $body->Body->bookstore->books->book[0]->title;
Möjligtvis?