扩展PHP';s单纯形元素
我正在向外部供应商发送XML文档,其中一个供应商在解析我们的XML时遇到问题,因为XML内容中存在单引号和双引号。我知道,根据官方的XML规范,只有在属性中使用时才需要转义,但我认为扩展PHP的SimpleXMLElement使其转义引号不会太困难。事实并非如此。我的第一次尝试是:扩展PHP';s单纯形元素,php,xml,Php,Xml,我正在向外部供应商发送XML文档,其中一个供应商在解析我们的XML时遇到问题,因为XML内容中存在单引号和双引号。我知道,根据官方的XML规范,只有在属性中使用时才需要转义,但我认为扩展PHP的SimpleXMLElement使其转义引号不会太困难。事实并非如此。我的第一次尝试是: <?php class BetterXMLElement extends SimpleXMLElement { public function __set($name, $value) {
<?php
class BetterXMLElement extends SimpleXMLElement
{
public function __set($name, $value)
{
echo "called __set with $name and $value";
$this->addChild($name, $value);
}
public function addChild($name, $value=null, $ns=null)
{
$new_value = strtr($value, [
'&' => '&',
'"' => '"',
"'" => ''',
]);
echo "New Value: $new_value\n";
parent::addChild($name, $new_value, $ns);
}
}
$xml = new BetterXMLElement('<?xml version="1.0" encoding="UTF-8"?><TRANSACTION></TRANSACTION>');
$xml->COST = "apos: ', amp: &, quot: \"";
$xml->addChild('PRODUCT', "apos: ', amp: &, quot: \"");
echo $xml->asXML();
不要使用简单的xml,它是垃圾 相反,请尝试DOMDocument() 这将创建以下内容:
<?xml version="1.0"?> <hello such="wow">This & That</hello>
This&;那个
不要使用简单的xml,它是垃圾
相反,请尝试DOMDocument()
这将创建以下内容:
<?xml version="1.0"?> <hello such="wow">This & That</hello>
This&;那个
据我所知,由于libxml2的固有设计,没有干净的内置方法来完成我需要使用simplexmlement或DOMDocument来完成的工作。最后,我在XML处理之前用占位符替换了必要的字符(例如,一个引号被替换为“{quot}”),然后在XML输出中用适当的HTML实体替换这些占位符
此外,正如axiac在之前的评论中指出的,SimpleXMLElement不是一个普通的PHP类,这就是我的重写尝试失败的原因。据我所知,由于libxml2的固有设计,没有干净的内置方式来完成我需要使用SimpleXMLElement或DOMDocument完成的工作。最后,我在XML处理之前用占位符替换了必要的字符(例如,一个引号被替换为“{quot}”),然后在XML输出中用适当的HTML实体替换这些占位符
此外,正如axiac在之前的评论中指出的,SimpleXMLElement不是一个普通的PHP类,这就是我的重写尝试失败的原因。一些代码示例显示了如何重现该问题,在这里会很有帮助。@JakubMatczak很好,我添加了一些示例用法和输出!
simplexmlement
类不是常规类。它看起来像一个类,但它以不规则的方式做很多事情。我建议您改用DOMDocument
。它提供了将文档序列化为XML文本的和以及许多检查和修改其内容的方法。一些显示如何重现问题的代码示例在这里会很有帮助。@JakubMatczak很好,我添加了一些示例用法和输出!simplexmlement
类不是常规类。它看起来像一个类,但它以不规则的方式做很多事情。我建议您改用DOMDocument
。它提供了将文档序列化为XML文本的和,以及许多检查和修改其内容的方法。
<?xml version="1.0"?> <hello such="wow">This & That</hello>