我正在将XML文件加载到SimpleXML中。然后将SimpleXML文件处理成不同的XML布局并写入磁盘。
原始XML文件在属性值和元素值中包含& < >
等属性。导入SimpleXML时,这些更改为&amp; &LT;取代。我需要在输出到新的XML布局时保留原始编码。
是否有办法阻止SimpleXML更改这些值或在导入后轻松重置它们。
示例原始XML
<?xml version="1.0" encoding="UTF-8"?>
<Players>
<Player id="12134" first_name="Dave" last_name="O'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'Shea" />
</xu:List>
我需要保留O&amp;#39;的价值。乳木果而不是奥谢。我无法控制原始XML。这只是一个例子,实际的XML文件要大得多,我需要将它应用于任何属性或值。
这可能吗?
答案 0 :(得分:0)
SimpleXml无法生成无效的XML,因此导入后无法转换具有编码权限的任何属性。考虑一下这个测试用例:
$xml = <<< XML
<root>
<element attr="3 & 5 are < 9 but > 6"/>
</root>
XML;
$root = simplexml_load_string($xml);
echo $root->asXml();
以上将给出:
<?xml version="1.0"?>
<root>
<element attr="3 & 5 are < 9 but > 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 & 5 are < 9 but > 6"/>
<element attr="3 & 5 are < 9 but > 6">
3 & 5 are < 9 but > 6
</element>
</root>
所以不应该有任何问题。事实上,当试图将htmlencoded实体放回到XML中时,这些实体会变得混乱,因为实体以&符号开头,然后编码然后编码为&amp; lt;,从而产生类似
的字符串&amp; 5 are &lt; 9 but &gt; 6
注意SimpleXml只会自动处理&amp;,&gt;,&lt;并且“因为那些被定义为XML的权利。你显示的字符编码不是。因此,当使用UTF-8时,不需要将它们作为字符编码,因为XML仍然有效。如果你的消费代码需要这些实体,我建议处理消费代码中的转换,而不是强迫它们进入XML。