PHP simpleXML làm cách nào để lưu tệp theo định dạng?


88

Tôi đang thử thêm một số dữ liệu vào tệp XML hiện có bằng cách sử dụng SimpleXML của PHP. Vấn đề là nó thêm tất cả dữ liệu trong một dòng:

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

Và như thế. Tất cả trong một dòng duy nhất. Làm thế nào để giới thiệu ngắt dòng?

Làm thế nào để tôi làm cho nó như thế này?

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

tôi đang dùng asXML() chức năng.

Cảm ơn.


Ngoài ra còn có gói PEAR XML_Beautifier .
karim79

Câu trả lời:


147

Bạn có thể sử dụng lớp DOMDocument để định dạng lại mã của mình:

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

Cảm ơn bạn. Đơn giản và hiệu quả.
Andrei Duma,

3
Vì vậy, nó không thể với SimpleXML?
Jonathan

@ xcy7e Không, tôi không nghĩ vậy.
Gumbo

1
Khi tôi cố gắng định dạng nội dung mà tôi đang thêm vào một tệp, nó chỉ hoạt động nếu tôi chỉ định keepWhiteSpace và formatOutput trước khi tải nội dung hiện có.
Sam

30

Giải pháp của Gumbo thực hiện được thủ thuật. Bạn có thể làm việc với simpleXml ở trên và sau đó thêm cái này vào cuối để tạo tiếng vang và / hoặc lưu nó với định dạng.

Mã bên dưới lặp lại nó và lưu nó vào một tệp (xem nhận xét trong mã và xóa bất kỳ thứ gì bạn không muốn):

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

Sử dụng dom_import_simplexmlđể chuyển đổi sang DomElement. Sau đó, sử dụng dung lượng của nó để định dạng đầu ra.

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

không hoạt động. Hàm trả về một DOMElement, không phải là một DOMDocument
karka91

Có vẻ documentElementnên được ownerDocument. Không chắc liệu api đã thay đổi hay đây chỉ là lỗi đánh máy. Tôi đã sửa nó ngay bây giờ.
troelskn

3
xin vui lòng lưu ý rằng điều này vẫn không hoạt động như preserveWhiteSpace và formatOutput nên được thiết lập trước khi nhập khẩu các tài liệu có bất kỳ tác dụng :)
karka91

Thật thú vị - đúng như bạn. Có vẻ như câu trả lời của Gumbo sẽ hiệu quả.
troelskn

2

Như GumboWitman đã trả lời; tải và lưu tài liệu XML từ một tệp hiện có (chúng tôi có rất nhiều người mới ở đây) với DOMDocument :: loadDOMDocument :: 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);
}
?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.