PHP simpleXML จะบันทึกไฟล์ในรูปแบบได้อย่างไร?


89

ฉันกำลังพยายามเพิ่มข้อมูลบางอย่างในไฟล์ XML ที่มีอยู่โดยใช้ SimpleXML ของ PHP ปัญหาคือมันเพิ่มข้อมูลทั้งหมดในบรรทัดเดียว:

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

และอื่น ๆ ทั้งหมดในบรรทัดเดียว แนะนำตัวแบ่งบรรทัดอย่างไร?

ฉันจะทำให้มันเป็นแบบนี้ได้อย่างไร?

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

ฉันกำลังใช้asXML()ฟังก์ชัน

ขอบคุณ.


นอกจากนี้ยังมีแพ็คเกจPEAR XML_Beautifier
karim79

ฉันรู้ว่านี่เป็นคำถามที่ค่อนข้างเก่าและคุณต้องหาทางแก้ปัญหา อาจมีประโยชน์สำหรับคนอื่น ๆ ลองดูที่github.com/spatie/array-to-xml
Vaibhav Malushte

คำตอบ:


148

คุณสามารถใช้คลาส DOMDocumentเพื่อฟอร์แมตโค้ดของคุณ:

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

ขอขอบคุณ. ง่ายและมีประสิทธิภาพ
Andrei Duma

3
ดังนั้นจึงเป็นไปไม่ได้ด้วย SimpleXML?
Jonathan

@ xcy7e ไม่ฉันไม่คิดอย่างนั้น
Gumbo

1
เมื่อฉันพยายามจัดรูปแบบเนื้อหาที่ฉันกำลังต่อท้ายไฟล์มันจะใช้งานได้ก็ต่อเมื่อฉันระบุ PreserveWhiteSpace และ formatOutput ก่อนโหลดเนื้อหาที่มีอยู่
แซม

31

วิธีแก้ปัญหาของ Gumbo เป็นเคล็ดลับ คุณสามารถทำงานกับ simpleXml ด้านบนแล้วเพิ่มสิ่งนี้ในตอนท้ายเพื่อ echo และ / หรือบันทึกด้วยการจัดรูปแบบ

โค้ดด้านล่างสะท้อนและบันทึกลงในไฟล์ (ดูความคิดเห็นในโค้ดและลบสิ่งที่คุณไม่ต้องการ):

//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');

19

ใช้dom_import_simplexmlเพื่อแปลงเป็น DomElement จากนั้นใช้ความจุเพื่อจัดรูปแบบเอาต์พุต

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

ไม่ทำงาน ฟังก์ชันส่งคืน DOMElement ไม่ใช่ DOMDocument
karka91

ดูเหมือนว่าควรจะเป็นdocumentElement ownerDocumentไม่แน่ใจว่า api มีการเปลี่ยนแปลงหรือเป็นเพียงการพิมพ์ผิด ฉันได้แก้ไขแล้ว
troelskn

3
โปรดทราบว่าสิ่งนี้ยังใช้ไม่ได้เนื่องจากควรตั้งค่า PreserveWhiteSpace และ formatOutput ก่อนที่จะนำเข้าเอกสารเพื่อให้มีผลใด ๆ :)
karka91

น่าสนใจ - ใช่แล้ว ดูเหมือนว่าคำตอบของ Gumbo จะใช้ได้ผล
troelskn

2

ตามที่GumboและWitmanตอบ; โหลดและบันทึกเอกสาร XML จากไฟล์ที่มีอยู่ (ซึ่งเราจำนวนมากมือใหม่รอบที่นี่) กับDOMDocument :: โหลดและDOMDocument :: ประหยัด

<?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);
}
?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.