2009-05-15 16 views
15

này:Bắt SimpleXMLElement để bao gồm các mã hóa trong sản lượng

$XML = new SimpleXMLElement("<foo />"); 
echo($XML->asXML()); 

... kết quả đầu ra này:

<?xml version="1.0"?> 
<foo/> 

Nhưng tôi muốn nó ra mã hóa, quá:

<?xml version="1.0" encoding="UTF-8"?> 
<foo/> 

Có cách nào để yêu cầu SimpleXMLElement bao gồm thuộc tính mã hóa của thẻ <? Xml?> Không? Ngoài việc thực hiện việc này:

$XML = new SimpleXMLElement("<?xml version='1.0' encoding='utf-8'?><foo />"); 
echo($XML->asXML()); 

Tác phẩm nào, nhưng thật khó chịu khi phải chỉ định phiên bản và mã hóa theo cách thủ công.

Giả sử cho mục đích của câu hỏi này là tôi không thể sử dụng DOMDocument thay thế.

+0

Tại sao bạn cần mã hóa có trong đầu ra? –

+3

Vì đó là yêu cầu bên ngoài. :) – dirtside

Trả lời

1

Tôi sẽ nói bạn sẽ cần thực hiện việc này khi tạo từng đối tượng XML. Ngay cả khi SimpleXMLElement có một cách để thiết lập nó, bạn vẫn sẽ cần phải thiết lập nó như tôi đoán nó sẽ có thể cho đối tượng để chọn một mặc định hợp lệ.

Có lẽ tạo ra một hằng số và Tạo các đối tượng như thế này

$XML = new SimpleXMLElement($XMLNamespace . "<foo />"); 
echo($XML->asXML()); 
+0

Giải pháp dễ nhất bao giờ hết, chỉ cần đảm bảo thêm "\ n" sau $ XMLNamespace. –

0

Nếu bạn không chỉ định một mã hóa, SimpleXML có thể không (sanely) đoán cái nào bạn dự định.

+0

Tôi biết, nhưng cách duy nhất để chỉ định mã hóa cho SimpleXML là làm cho nó rõ ràng trong hàm tạo - và sau đó bạn phải chỉ định thuộc tính phiên bản XML, hoặc nó ném một lỗi. Tôi rõ ràng có thể làm theo cách đó, nó chỉ gây phiền nhiễu khi phải làm điều đó. Tôi đoán SimpleXML hơi đơn giản :) – dirtside

+0

Tôi không thể tìm thấy bất kỳ tham chiếu nào trong tài liệu này nhưng tôi có ấn tượng rằng bạn * không thể chỉ định mã hóa — vì SimpleXML mong đợi UTF-8. –

20

Bạn có thể thử điều này, nhưng bạn phải sử dụng simplexml_load_string với $ xml

$xml // Your main SimpleXMLElement 
$xml->addAttribute('encoding', 'UTF-8'); 

Hoặc bạn vẫn có thể sử dụng các phương tiện khác để thêm mã hóa để đầu ra của bạn.

đơn giản thay thế

$outputXML=str_replace('<?xml version="1.0"?>', '<?xml version="1.0" encoding="UTF-8"?>', $outputXML); 

Regular Expressions

$outputXML=preg_replace('/<\?\s*xml([^\s]*)\?>/' '<?xml $1 encoding="UTF-8"?>', $outputXML); 

DOMDocument-Tôi biết bạn nói bạn không muốn sử dụng DOMDocument, nhưng đây là một ví dụ

$xml=dom_import_simplexml($simpleXML); 
$xml->xmlEndoding='UTF-8'; 
$outputXML=$xml->saveXML(); 

Bạn có thể quấn mã này vào một chức năng tiếp nhận một tham số $ mã hóa và thêm nó vào

4

đơn giản và rõ ràng chỉ làm điều này

$XMLRoot = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><element></element>'); 

Output

<?xml version="1.0" encoding="UTF-8"?> 
     <element></element> 

để thêm thuộc tính trong phần tử chỉ sử dụng

$XMLRoot->addAttribute('name','juan'); 

thêm sử dụng con

$childElement = $XMLRoot->addChild('elementChild'); 
$childElement->addAttribute('attribName','somthing'); 
1

Đề xuất DOMDoc của Cristian Toma dường như một cách tiếp cận tốt nếu tài liệu không phải là quá nặng. Bạn có thể quấn nó lên trong một cái gì đó như thế này:

private function changeEncoding(string $xml, string $encoding) { 
    $dom = new \DOMDocument(); 
    $dom->loadXML($xml); 
    $dom->encoding = $encoding; 
    return $dom->saveXML(); 
} 

Có ích khi bạn không có quyền truy cập vào bộ nối tiếp sản xuất xml.

Các vấn đề liên quan