让 SimpleXMLElement 在输出中包含编码

Posted

技术标签:

【中文标题】让 SimpleXMLElement 在输出中包含编码【英文标题】:Getting SimpleXMLElement to include the encoding in output 【发布时间】:2010-10-26 13:27:03 【问题描述】:

这个:

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

...输出这个:

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

但我也希望它输出编码:

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

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

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

这可行,但必须手动指定版本和编码很烦人。

假设我不能使用 DOMDocument 代替这个问题。

【问题讨论】:

为什么需要输出中的编码? 因为这是外部要求。 :) 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

简单明了只做这个

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

【讨论】:

清晰易懂!谢谢。一个提示:$XMLRoot = new SimpleXMLElement('&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;element /&gt;'); 让它更短【参考方案3】:

你可以试试这个,但你必须为 $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并将它添加到

【讨论】:

您的 DOMDocument 中有语法错误:$xml-&gt;xmlEndoding='UTF-8'; 应该是 $xml-&gt;xmlEncoding='UTF-8';【参考方案4】:

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

【讨论】:

我知道,但是为 SimpleXML 指定编码的唯一方法是在构造函数中使其显式化——然后您还必须指定 XML 版本属性,否则会引发错误。我显然可以这样做,只是不得不这样做很烦人。我猜 SimpleXML 有点太简单了 :) 我在文档中找不到对此的任何引用,但我的印象是您无法指定编码——因为 SimpleXML 需要 UTF-8。跨度> 【参考方案5】:

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

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

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

【讨论】:

最简单的解决方案,只需确保在 $XMLNamespace 之后添加“\n”。

以上是关于让 SimpleXMLElement 在输出中包含编码的主要内容,如果未能解决你的问题,请参考以下文章

在 cpack 输出中包含外部库

Spark:你能在输出文件中包含分区列吗?

如何防止 ProGuard 在输出 jar 中包含引用的库

在 C# 中,如何使用反射计算表达式主体输出函数中包含的属性数量?

在 VC++(VS2010) 项目输出中包含 DLL

在 JSON 输出中包含 get_absolute_url 值