2009-04-28 14 views
81

Próbuję dodać niektóre dane do istniejącego pliku XML za pomocą PHP SimpleXML. Problem polega na tym, że dodaje wszystkie dane w jednym wierszu:PHP simpleXML, jak zapisać plik w sformatowany sposób?

<name>blah</name><class>blah</class><area>blah</area> ... 

I tak dalej. Wszystko w jednym wierszu. Jak wprowadzić podział linii?

Jak mogę to zmienić?

<name>blah</name> 
<class>blah</class> 
<area>blah</area> 

Używam funkcji asXML().

Dzięki.

+0

Dostępny jest również pakiet PEAR [XML_Beautifier] (http://pear.php.net/package/XML_Beautifier). – karim79

Odpowiedz

133

Można użyć DOMDocument class sformatować kod:

$dom = new DOMDocument('1.0'); 
$dom->preserveWhiteSpace = false; 
$dom->formatOutput = true; 
$dom->loadXML($simpleXml->asXML()); 
echo $dom->saveXML(); 
+0

Dzięki. Działa świetnie. – Alagu

+0

Dziękuję. Prosty i wydajny. –

+2

Więc nie jest to możliwe z SimpleXML? –

17

Zastosowanie dom_import_simplexml przekonwertować na DOMElement. Następnie użyj jego pojemności, aby sformatować dane wyjściowe.

$dom = dom_import_simplexml($simple_xml)->ownerDocument; 
$dom->preserveWhiteSpace = false; 
$dom->formatOutput = true; 
echo $dom->saveXML(); 
+0

nie działa. Funkcja zwraca DOMElement, a nie DOMDocument. – karka91

+0

Wygląda, że ​​"documentElement" powinien być "ownerDocument". Nie jestem pewien, czy api się zmieniło, czy to tylko literówka. Poprawiłem to teraz. – troelskn

+2

należy pamiętać, że to nadal nie działa, ponieważ preserveWhiteSpace i formatOutput powinny być ustawione _before_ importowanie dokumentu, aby uzyskać jakikolwiek efekt :) – karka91

27

Rozwiązanie Gumbo załatwia sprawę. Możesz wykonać pracę z simpleXml powyżej, a następnie dodać to na końcu do echa i/lub zapisać go z formatowaniem.

kod poniżej echa go i zapisuje je do pliku (patrz komentarze w kodzie i usunąć cokolwiek nie chcesz):

//Format XML to save indented tree rather than one line 
$dom = new DOMDocument('1.0'); 
$dom->preserveWhiteSpace = false; 
$dom->formatOutput = true; 
$dom->loadXML($simpleXml->asXML()); 
//Echo XML - remove this and following line if echo not desired 
echo $dom->saveXML(); 
//Save XML to file - remove this and following line if save not desired 
$dom->save('fileName.xml'); 
+0

nadal działa jak urok! – Risinek

2

Jak Gumbo i Witman odpowiedział; ładowanie i zapisywanie dokumentu XML z istniejącego pliku (mamy tu dużo nowych) z DOMDocument::load i DOMDocument::save.

<?php 
$xmlFile = 'filename.xml'; 
if(!file_exists($xmlFile)) die('Missing file: ' . $xmlFile); 
else 
{ 
    $dom = new DOMDocument('1.0'); 
    $dom->preserveWhiteSpace = false; 
    $dom->formatOutput = true; 
    $dl = @$dom->load($xmlFile); // remove error control operator (@) to print any error message generated while loading. 
    if (!$dl) die('Error while parsing the document: ' . $xmlFile); 
    echo $dom->save($xmlFile); 
} 
?> 
Powiązane problemy