22

这个:

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

...输出:

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

但我也希望它输出编码:

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

有没有办法告诉 SimpleXMLElement 包含 <?xml?> 标记的编码属性?除了这样做:

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

哪个有效,但是必须手动指定版本和编码很烦人。

出于这个问题的目的,假设我不能使用 DOMDocument 代替。

4

5 回答 5

23

你可以试试这个,但你必须为 $xml使用simplexml_load_string

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

或者您仍然可以使用其他方式将编码添加到您的输出中。

简单更换

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

常用表达

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

DOMDocument -我知道你说过你不想使用 DOMDocument,但这里有一个例子

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

您可以将此代码包装到一个函数中,该函数接收参数 $encoding 并将其添加到

于 2009-07-30T11:48:16.877 回答
13

简单明了只做这个

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

输出

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

在元素中添加属性仅使用

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

添加儿童使用

$childElement = $XMLRoot->addChild('elementChild');
$childElement->addAttribute('attribName','somthing');
于 2016-05-14T19:15:23.867 回答
2

如果文档不太重, Cristian Toma的 DOMDoc 提议似乎是一个不错的方法。你可以把它包装成这样:

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

当您无权访问生成 xml 的序列化程序时会派上用场。

于 2017-06-15T12:27:19.893 回答
1

我会说您需要在创建每个 XML 对象时执行此操作。即使 SimpleXMLElement 有设置它的方法,你仍然需要设置它,因为我猜对象可能会选择一个有效的默认值。

也许创建一个常量并像这样创建对象

$XML = new SimpleXMLElement($XMLNamespace . "<foo />");
echo($XML->asXML());
于 2009-05-16T07:37:01.593 回答
0

如果您不指定编码,SimpleXML 无法(理智地)猜出您想要的是哪一个。

于 2009-05-22T03:05:26.710 回答