2011-12-23 23 views
41

Dưới đây là các mã:PHP XML làm thế nào để định dạng đầu ra thoải mái

$doc = new DomDocument('1.0'); 
// create root node 
$root = $doc->createElement('root'); 
$root = $doc->appendChild($root); 
$signed_values = array('a' => 'eee', 'b' => 'sd', 'c' => 'df'); 
// process one row at a time 
foreach ($signed_values as $key => $val) { 
    // add node for each row 
    $occ = $doc->createElement('error'); 
    $occ = $root->appendChild($occ); 
    // add a child node for each field 
    foreach ($signed_values as $fieldname => $fieldvalue) { 
     $child = $doc->createElement($fieldname); 
     $child = $occ->appendChild($child); 
     $value = $doc->createTextNode($fieldvalue); 
     $value = $child->appendChild($value); 
    } 
} 
// get completed xml document 
$xml_string = $doc->saveXML() ; 
echo $xml_string; 

Nếu tôi in nó trong trình duyệt Tôi không nhận được cấu trúc XML đẹp như

<xml> \n tab <child> etc. 

tôi chỉ nhận được

<xml><child>ee</child></xml> 

Và tôi muốn là utf-8 Làm cách nào để thực hiện điều này?

+0

Về vấn đề utf-8 của bạn, chỉ cần thêm nó vào đối tượng như một tham số thứ hai như '$ doc = DOMDocument mới ("1.0", "UTF-8");' – Thielicious

Trả lời

73

Bạn có thể thử để làm điều này:

... 
// get completed xml document 
$doc->preserveWhiteSpace = false; 
$doc->formatOutput = true; 
$xml_string = $doc->saveXML(); 
echo $xml_string; 

Bạn có thể làm cho thiết lập các thông số ngay sau khi bạn đã tạo DOMDocument cũng như:

$doc = new DomDocument('1.0'); 
$doc->preserveWhiteSpace = false; 
$doc->formatOutput = true; 

Đó có thể là ngắn gọn hơn. Sản lượng trong cả hai trường hợp là (Demo):

<?xml version="1.0"?> 
<root> 
    <error> 
    <a>eee</a> 
    <b>sd</b> 
    <c>df</c> 
    </error> 
    <error> 
    <a>eee</a> 
    <b>sd</b> 
    <c>df</c> 
    </error> 
    <error> 
    <a>eee</a> 
    <b>sd</b> 
    <c>df</c> 
    </error> 
</root> 

Tôi không biết làm thế nào để thay đổi nhân vật thụt đầu dòng (s) với DOMDocument. Bạn có thể gửi-quá trình XML với một line-by-line thường xuyên thể hiện dựa thay thế (ví dụ: với preg_replace):

$xml_string = preg_replace('/(?:^|\G) /um', "\t", $xml_string); 

Ngoài ra, có các tidy extension with tidy_repair_string mà có thể khá dữ liệu in XML là tốt. Có thể chỉ định các mức thụt đầu dòng với nó, tuy nhiên, gọn gàng sẽ không bao giờ xuất các tab.

tidy_repair_string($xml_string, ['input-xml'=> 1, 'indent' => 1, 'wrap' => 0]); 
+0

liên quan: [* Debug một Đối tượng DOMDocument trong PHP *] (http://stackoverflow.com/q/684227/367456) cho một dạng được kiểm soát nhiều hơn về in XML. – hakre

+0

Liên quan: [* Chuyển đổi thụt đầu dòng với preg_replace (không gọi lại) *] (http://stackoverflow.com/q/8616594/367456) – hakre

+0

Tôi đã phát hiện ra rằng * "Bạn có thể đặt các thông số này ngay sau khi bạn đã tạo DOMDocument cũng "* không phải là một ý tưởng tuyệt vời nếu bạn sử dụng' saveXML' trong khi xử lý/so sánh nó với một tài liệu khác vì nó có thể dẫn đến kết quả không mong muốn. Tốt nhất để định dạng đầu ra ngay trước khi bạn cần đầu ra. –

3

Hai vấn đề khác nhau ở đây:

  • Đặt formatOutputpreserveWhiteSpace thuộc tính để TRUE để tạo ra XML định dạng:

    $doc->formatOutput = TRUE; 
    $doc->preserveWhiteSpace = TRUE; 
    
  • Nhiều trình duyệt web (cụ thể là Internet Explorer và Firefox) định dạng XML khi chúng hiển thị nó. Sử dụng tính năng Xem nguồn hoặc trình soạn thảo văn bản thông thường để kiểm tra đầu ra.


Xem thêm xmlEncodingencoding.

+1

'preserveWhiteSpace = TRUE' có thể theo cách của bạn khi bạn in khá với' DOMDocument' - chỉ FYI, không phải với ví dụ được đưa ra trong câu hỏi, nhưng nếu bạn tải từ các tệp hiện có thực sự khoảng trắng văn bản. – hakre

+0

@hakre Tại sao 'preserveWhiteSpace = TRUE' hoạt động tốt với XML, nhưng không hoạt động với HTML? – Yang

+0

Để cho phép trình duyệt định dạng, một loại MIME phù hợp phải được đặt. Ví dụ: tiêu đề: tiêu đề ('Loại nội dung: văn bản/xml'); – Den

20

Với một đối tượng SimpleXML, bạn có thể chỉ đơn giản là

$domxml = new DOMDocument('1.0'); 
$domxml->preserveWhiteSpace = false; 
$domxml->formatOutput = true; 
/* @var $xml SimpleXMLElement */ 
$domxml->loadXML($xml->asXML()); 
$domxml->save($newfile); 

$xml là của bạn đối tượng SimpleXML

Vì vậy, sau đó bạn SimpleXML có thể được lưu dưới dạng tập tin mới theo quy định của $newfile

+0

Bạn nói SimpleXML, nhưng bạn đang sử dụng DOMDocument ... – quickshiftin

+0

@quickshiftin - Dữ liệu đầu vào là một thể hiện của 'SimpleXMLElement'. Tôi sẽ chỉnh sửa câu trả lời để làm cho nó rõ ràng hơn. Dù sao, tôi đồng ý rằng những gì bạn cung cấp 'DOMDocument' với thực sự không liên quan. –

1

Đây là một nhẹ biến thể của chủ đề trên nhưng tôi đặt ở đây trong trường hợp những người khác nhấn vào đây và không thể hiểu được nó ... như tôi đã làm.

Khi sử dụng saveXML(), bảo toànWhiteSpace trong DOMdocument đích không áp dụng cho các nút đã nhập (như tại PHP 5.6).

Xét đoạn mã sau:

$dom = new DOMDocument();        //create a document 
$dom->preserveWhiteSpace = false;      //disable whitespace preservation 
$dom->formatOutput = true;        //pretty print output 
$documentElement = $dom->createElement("Entry");  //create a node 
$dom->appendChild ($documentElement);     //append it 
$message = new DOMDocument();       //create another document 
$message->loadXML($messageXMLtext);      //populate the new document from XML text 
$node=$dom->importNode($message->documentElement,true); //import the new document content to a new node in the original document 
$documentElement->appendChild($node);     //append the new node to the document Element 
$dom->saveXML($dom->documentElement);     //print the original document 

Trong bối cảnh này, báo cáo kết quả $dom->saveXML(); sẽ KHÔNG khá in nội dung được nhập khẩu từ $ message, nhưng nội dung ban đầu trong $ dom sẽ được khá in.

Để đạt được in ấn đẹp cho toàn bộ tài liệu $ dom, dòng:

$message->preserveWhiteSpace = false; 

buộc phải có sau dòng $message = new DOMDocument(); - tức. tài liệu/s mà từ đó các nút được nhập cũng phải có bảo vệWhiteSpace = false.

9
<?php 

$xml = $argv[1]; 

$dom = new DOMDocument(); 

// Initial block (must before load xml string) 
$dom->preserveWhiteSpace = false; 
$dom->formatOutput = true; 
// End initial block 

$dom->loadXML($xml); 
$out = $dom->saveXML(); 

print_R($out); 
+1

bạn cũng có thể thêm một lời giải thích? – Robert

+0

đặt định dạngOutput = true & preserveWhiteSpace = false, trước khi bạn tải chuỗi xml, nếu không nó sẽ không có hiệu lực --- nếu bạn có thể hiểu tiếng anh của tôi, oh, bạn là thiên tài !!! – sigkill

1
// ##### IN SUMMARY ##### 

$xmlFilepath = 'test.xml'; 
echoFormattedXML($xmlFilepath); 

/* 
* echo xml in source format 
*/ 
function echoFormattedXML($xmlFilepath) { 
    header('Content-Type: text/xml'); // to show source, not execute the xml 
    echo formatXML($xmlFilepath); // format the xml to make it readable 
} // echoFormattedXML 

/* 
* format xml so it can be easily read but will use more disk space 
*/ 
function formatXML($xmlFilepath) { 
    $loadxml = simplexml_load_file($xmlFilepath); 

    $dom = new DOMDocument('1.0'); 
    $dom->preserveWhiteSpace = false; 
    $dom->formatOutput = true; 
    $dom->loadXML($loadxml->asXML()); 
    $formatxml = new SimpleXMLElement($dom->saveXML()); 
    //$formatxml->saveXML("testF.xml"); // save as file 

    return $formatxml->saveXML(); 
} // formatXML 
+0

được bỏ phiếu, vì câu trả lời này chứa một ví dụ hoàn chỉnh! – baris1892

0

Cố gắng tất cả các câu trả lời nhưng không ai làm việc. Có lẽ đó là vì tôi đang phụ thêm và xóa con trước khi lưu XML. Sau rất nhiều googling tìm thấy this comment trong tài liệu php. Tôi chỉ phải tải lại XML kết quả để làm cho nó hoạt động.

$outXML = $xml->saveXML(); 
$xml = new DOMDocument(); 
$xml->preserveWhiteSpace = false; 
$xml->formatOutput = true; 
$xml->loadXML($outXML); 
$outXML = $xml->saveXML(); 
Các vấn đề liên quan