扩展PHP';s单纯形元素

扩展PHP';s单纯形元素,php,xml,Php,Xml,我正在向外部供应商发送XML文档,其中一个供应商在解析我们的XML时遇到问题,因为XML内容中存在单引号和双引号。我知道,根据官方的XML规范,只有在属性中使用时才需要转义,但我认为扩展PHP的SimpleXMLElement使其转义引号不会太困难。事实并非如此。我的第一次尝试是: <?php class BetterXMLElement extends SimpleXMLElement { public function __set($name, $value) {

我正在向外部供应商发送XML文档,其中一个供应商在解析我们的XML时遇到问题,因为XML内容中存在单引号和双引号。我知道,根据官方的XML规范,只有在属性中使用时才需要转义,但我认为扩展PHP的SimpleXMLElement使其转义引号不会太困难。事实并非如此。我的第一次尝试是:

<?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, [
            '&' => '&amp;',
            '"' => '&quot;',
            "'" => '&apos;',
        ]);
        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 &amp; That</hello>
This&;那个

不要使用简单的xml,它是垃圾

相反,请尝试DOMDocument()

这将创建以下内容:

<?xml version="1.0"?> <hello such="wow">This &amp; 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 &amp; That</hello>