Php 将simplexmlelement强制转换为字符串以获取内部内容,但保留htmlspecialchars转义

Php 将simplexmlelement强制转换为字符串以获取内部内容,但保留htmlspecialchars转义,php,xml,simplexml,htmlspecialchars,object-to-string,Php,Xml,Simplexml,Htmlspecialchars,Object To String,我有一个XML文件: $xml = <<<EOD <?xml version="1.0" encoding="utf-8"?> <metaData xmlns="http://www.test.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="test"> <qkc6b1hh0k9>testdata&amp;more</

我有一个XML文件:

$xml = <<<EOD
<?xml version="1.0" encoding="utf-8"?>
<metaData xmlns="http://www.test.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="test">
<qkc6b1hh0k9>testdata&amp;more</qkc6b1hh0k9>
</metaData>
EOD;
我希望能拿到绳子

testdata&amp;more
。。。但是我有

testdata&more
  • 为什么simplexmlobject的_toString()方法会将转义的特殊字符转换为普通字符?我可以停止这种行为吗
  • 我想出了一个临时的解决方案,我认为它是肮脏的,你说呢? (strip_标记($xPathElems[0]->asXML())

  • DOM文件是否可以作为替代方案

谢谢你对我的问题的帮助

编辑

问题解决了,问题不在simplexml的_-toString方法中,而是在稍后将字符串与addChild一起使用时出现的

如上所述的行为完全没有问题,正如您在回答中所看到的那样,这是意料之中的

问题只是在通过“addChild”将值添加到另一个xml文档时出现的。
由于addChild不会转义符号()必须手动执行。

如果您使用任何sane方法创建XML标记,并将其设置为包含字符串
“testdata&more”
,则将转义为
testdata&;更多信息
。因此,从逻辑上讲,将该字符串内容提取出来会反转转义过程,从而为您提供输入的文本

问题是,为什么需要XML转义表示?如果您希望元素的内容符合作者的意图,那么
\uuu toString()
就是在做正确的事情;在XML中表示该字符串的方法不止一种,但您通常应该关心的是所表示的数据

如果出于某种原因,您确实需要在特定实例中构造XML的详细信息,那么可以使用更复杂的解析框架,例如DOM,它将分离
testdata&;more
进入一个文本节点(包含“testdata”)、一个实体节点(名称为“amp”)和另一个文本节点(包含“more”)


另一方面,如果您只想将其放回另一个XML(或HTML)文档中,那么让SimpleXML正确地执行取消跳过操作,并在适当的时间重新对其进行转义。

如果您使用任何合理的方法创建一个XML标记,并将其设置为包含字符串
“testdata&more”
,这将作为
testdata&;更多信息
。因此,从逻辑上讲,将该字符串内容提取出来会反转转义过程,从而为您提供输入的文本

问题是,为什么需要XML转义表示?如果您希望元素的内容符合作者的意图,那么
\uuu toString()
就是在做正确的事情;在XML中表示该字符串的方法不止一种,但您通常应该关心的是所表示的数据

如果出于某种原因,您确实需要在特定实例中构造XML的详细信息,那么可以使用更复杂的解析框架,例如DOM,它将分离
testdata&;more
进入一个文本节点(包含“testdata”)、一个实体节点(名称为“amp”)和另一个文本节点(包含“more”)

另一方面,如果您只想将它放回另一个XML(或HTML)文档中,那么让SimpleXML正确地执行此取消转移,并在适当的时间重新转义它

为什么simplexmlobject的_toString()方法会将转义的特殊字符转换为普通字符?我可以停止这种行为吗

因为这些“特殊”字符实际上是字符的XML编码。使用字符串值可以再次逐字显示这些字符。这就是XML解析器的用途

我想出了一个临时的解决方案,我认为它是肮脏的,你说呢? 嗯,不稳定。相反,我建议您使用相反的方法:XML编码字符串:

$var = htmlspecialchars($xPathElems[0]);
var_dump($var);
DOM文件是否可以作为替代方案

不,与SimpleXML一样,它是一个XML解析器,因此您也可以对文本进行解码。这并不是完全正确的(您可以使用DomDocument通过遍历所有子节点并拾取字符数据旁边的实体节点来实现这一点,但这需要做更多的工作,正如上面使用htmlspecialchars()所述)

为什么simplexmlobject的_toString()方法会将转义的特殊字符转换为普通字符?我可以停止这种行为吗

因为这些“特殊”字符实际上是字符的XML编码。使用字符串值可以再次逐字显示这些字符。这就是XML解析器的用途

我想出了一个临时的解决方案,我认为它是肮脏的,你说呢? 嗯,不稳定。相反,我建议您使用相反的方法:XML编码字符串:

$var = htmlspecialchars($xPathElems[0]);
var_dump($var);
DOM文件是否可以作为替代方案


不,与SimpleXML一样,它是一个XML解析器,因此您也可以对文本进行解码。这并不是完全正确的(您可以使用DomDocument通过遍历所有子节点并拾取字符数据旁边的实体节点来做到这一点,但这需要做更多的工作,正如上面使用htmlspecialchars()所概述的那样)。

就是这样。。。数据被放回另一个xml文档中。但另一个xmldocument中的节点最后只有:“testdata”。例如,从-addChild中剪切的任何符号and和after都不会转换符号()Ah,因此问题根本不在于
\uu toString
,而在于目标文档上的
addChild
。任何数据源都可能给你一个符号,并导致同样的问题。是的,没错!好像他们错过了带着“addChild”逃离符号的机会。。。甚至可能是一个bug…?@Preexo:要说得更多,你需要展示一些代码。你看,情况就是这样。。。数据被放回另一个xml文档中。但另一个xmldocument中的节点最后只有:“testdata”。例如,从-addChild中剪切的任何符号and和after都不会转换符号()啊,因此问题根本不在于
\uu toString
,而在于
addChild<