---
title: "SimpleXML"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/169670-simplexml"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "learn"
published: "2008-03-06T20:23:54.000Z"
updated: "2008-03-07T10:44:18.000Z"
replies: 11
views: 609
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/169670-simplexml"
---

# SimpleXML

## #1 — learn, 2008-03-06T20:23Z

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:

```php
$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

Permalänk: https://www.webforum.nu/p/169670

## #2 — SPiN, 2008-03-06T20:39Z

```
...
$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;
}
```

Permalänk: https://www.webforum.nu/p/2086610

## #3 — learn, 2008-03-06T20:50Z

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>
```

 

```php
$xml = simplexml_load_file("books.xml");
echo $xml->soap:Body->bookstore->books->book[0]->title;
```

 

Felmeddelande:

```
Parse error: syntax error, unexpected ':', expecting ',' or ';' in...
```

Permalänk: https://www.webforum.nu/p/2086614

## #4 — learn, 2008-03-06T20:58Z

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!   :)

Permalänk: https://www.webforum.nu/p/2086617

## #5 — learn, 2008-03-06T22:37Z

Någon som åtminstone vet hur man gör med specialtecknena?

> **learn skrev:**
>
> ```php
> $xml = simplexml_load_file("books.xml");
> echo $xml->soap:Body->bookstore->books->book[0]->title;
> ```
>
>  
> 
> Felmeddelande:
> 
>
>
> ```
> Parse error: syntax error, unexpected ':', expecting ',' or ';' in...
> ```

Permalänk: https://www.webforum.nu/p/2086638

## #6 — MickeA.com, 2008-03-07T07:42Z

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?

Permalänk: https://www.webforum.nu/p/2086666

## #7 — SPiN, 2008-03-07T07:50Z

'soap' är i det här fallet en namnrymd som du får läsa från:

```php
$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?

```php
$ns = $xml->children('soap');
$myBooks = $ns->Body->bookstore->books->book;
echo $myBooks[0]->title;
```

Permalänk: https://www.webforum.nu/p/2086667

## #8 — learn, 2008-03-07T07:57Z

> **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>
> ```
>
>  
> 
>
>
> ```php
> $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.

Permalänk: https://www.webforum.nu/p/2086668

## #9 — MickeA.com, 2008-03-07T08:55Z

Fungerade inte det här?

> **SPiN skrev:**
>
> 'soap' är i det här fallet en namnrymd som du får läsa från:
>
>
> ```php
> $ns = $xml->children('soap');
> echo $ns->Body->bookstore->books->book[0]->title;
> ```

Permalänk: https://www.webforum.nu/p/2086674

## #10 — learn, 2008-03-07T09:07Z

Nej det funkar inte...

Permalänk: https://www.webforum.nu/p/2086675

## #11 — zcorpan, 2008-03-07T09:53Z

> ```
> <?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.

Permalänk: https://www.webforum.nu/p/2086677

## #12 — SPiN, 2008-03-07T10:44Z

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.

```php
$envelope = $xml->children('soap');
$body = $envelope->Envelope->children('soap');
echo $body->Body->bookstore->books->book[0]->title;
```

Möjligtvis?

Permalänk: https://www.webforum.nu/p/2086687

---

Tråden på webben: https://www.webforum.nu/amne/php/169670-simplexml
