让 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('<?xml version="1.0" encoding="utf-8"?><element />');
让它更短【参考方案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->xmlEndoding='UTF-8';
应该是 $xml->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 在输出中包含编码的主要内容,如果未能解决你的问题,请参考以下文章