在SimpleXML中保留编码

时间:2011-03-30 07:46:14

标签: php encoding simplexml

我正在将XML文件加载到SimpleXML中。然后将SimpleXML文件处理成不同的XML布局并写入磁盘。

原始XML文件在属性值和元素值中包含& < >等属性。导入SimpleXML时,这些更改为& <取代。我需要在输出到新的XML布局时保留原始编码。

是否有办法阻止SimpleXML更改这些值或在导入后轻松重置它们。

示例原始XML

<?xml version="1.0" encoding="UTF-8"?>
<Players> 
   <Player id="12134" first_name="Dave" last_name="O&#39;Shea" />    
</Players>

的SimpleXML

SimpleXMLElement Object
(
    [Player] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [id] => 12134
                    [first_name] => Dave
                    [last_name] => O'Shea
                )

        )

)

需要输出的示例

<xu:List> 
   <xu:Item id="5687" name="Dave O&#39;Shea" />    
</xu:List>

我需要保留O&amp;#39;的价值。乳木果而不是奥谢。我无法控制原始XML。这只是一个例子,实际的XML文件要大得多,我需要将它应用于任何属性或值。

这可能吗?

1 个答案:

答案 0 :(得分:0)

SimpleXml无法生成无效的XML,因此导入后无法转换具有编码权限的任何属性。考虑一下这个测试用例:

$xml = <<< XML
<root>
    <element attr="3 &amp; 5 are &lt; 9 but &gt; 6"/>
</root>
XML;
$root = simplexml_load_string($xml);
echo $root->asXml();

以上将给出:

<?xml version="1.0"?>
<root>
    <element attr="3 &amp; 5 are &lt; 9 but &gt; 6"/>
</root>

如您所见,属性仍然是编码的。只有当你用

将它们拉出来时
$attr = $root->element['attr'];
echo $attr; 

他们未被编码为3 & 5 are < 9 but > 6。如果您不想这样,请通过htmlspecialchars运行字符串以重新编码实体。但是,由于SimpleXml无法生成无效的XML,因此在将它们放在需要对其进行编码的XML中的任何位置时,您不必重新编码它们,例如。

$root->element[]['attr'] = $attr; // create new element with attribute
$root->element[1] = $attr;        // add attribute as element node value
echo $root->asXml();

将导致(手动格式化以便于阅读)

<?xml version="1.0"?>
<root>
    <element attr="3 &amp; 5 are &lt; 9 but &gt; 6"/>
    <element attr="3 &amp; 5 are &lt; 9 but &gt; 6">
        3 &amp; 5 are &lt; 9 but &gt; 6
    </element>
</root>

所以不应该有任何问题。事实上,当试图将htmlencoded实体放回到XML中时,这些实体会变得混乱,因为实体以&符号开头,然后编码然后编码为&amp; lt;,从而产生类似

的字符串
&amp;amp; 5 are &amp;lt; 9 but &amp;gt; 6

更新后编辑

注意SimpleXml只会自动处理&amp;,&gt;,&lt;并且“因为那些被定义为XML的权利。你显示的字符编码不是。因此,当使用UTF-8时,不需要将它们作为字符编码,因为XML仍然有效。如果你的消费代码需要这些实体,我建议处理消费代码中的转换,而不是强迫它们进入XML。