【问题标题】:cast simplexmlelement to string to get inner content but keep htmlspecialchars escaped将 simplexmlelement 转换为字符串以获取内部内容,但保持 htmlspecialchars 转义
【发布时间】:2013-04-18 11:05:28
【问题描述】:

我有一个 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;

现在我将它加载到一个 simplexmlobject 中,稍后我想获取“qkc6b1hh0k9”-node 的内部

$xmlRootElem = simplexml_load_string( $xml );
$xmlRootElem->registerXPathNamespace( 'xmlns', "http://www.test.com/" );

// ...

$xPathElems = $xmlRootElem->xpath( './'."xmlns:qkc6b1hh0k9" );
$var = (string)($xPathElems[0]);
var_dump($var);

我希望得到字符串

testdata&amp;more

...但我得到了

testdata&more
  • 为什么 simplexmlobject 的 __toString() 方法将我转义的特殊字符转换为普通字符?我可以停用此行为吗?
  • 我想出了一个临时解决方案,我认为它很脏,你说呢?

    (strip_tags($xPathElems[0]->asXML()))

  • DOMDocument 可以替代吗?

感谢您对我的问题的任何帮助!

编辑

问题解决了,不是simplexml的__toString方法,是后来用addChild使用字符串的时候出现的

上述行为完全没问题,正如您在答案中看到的那样,这是可以预期的......

只有在通过“addChild”将该值添加到另一个 xml 文档时才会出现问题。 由于 addChild 不会转义与号 (http://www.php.net/manual/de/simplexmlelement.addchild.php#103587),因此必须手动完成。

【问题讨论】:

    标签: php xml simplexml htmlspecialchars object-to-string


    【解决方案1】:

    为什么 simplexmlobject 的 __toString() 方法将我转义的特殊字符转换为普通字符?我可以停用此行为吗?

    因为那些“特殊”字符实际上是字符的 XML 编码。使用字符串值再次为您提供这些字符。这就是 XML 解析器的用途。

    我想出了一个临时解决方案,我认为它很脏,你说什么?

    嗯,摇摇欲坠。相反,让我建议您反过来:XML 对字符串进行编码:

    $var = htmlspecialchars($xPathElems[0]);
    var_dump($var);
    

    DOMDocument 可以替代吗?

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

    【讨论】:

      【解决方案2】:

      如果您通过任何合理的方法创建 XML 标记,并将其设置为包含字符串 "testdata&amp;more",这将被转义为 testdata&amp;amp;more。因此,将字符串内容提取出来反转转义过程以提供您输入的文本是合乎逻辑的。

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

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

      另一方面,如果您只想将其放回另一个 XML(或 HTML)文档中,则让 SimpleXML 正确地进行反转义,并在适当的时候重新转义。

      【讨论】:

      • 原来如此……数据被放回到另一个xml文档中。但另一个 xmldocument 中的节点仅以:“testdata”结束。从&符号和之后的任何东西都被切断 - 例如 addChild 不会转换&符号(php.net/manual/de/simplexmlelement.addchild.php#103587
      • 啊,所以问题根本不在于__toString,而在于目标文档上的addChild任何数据源都可能给您一个&符号并导致同样的问题。
      • 没错!似乎他们错过了用“addChild”转义&符号......甚至可能是一个错误......?
      • @Preexo:要说更多,您需要显示一些代码。另见3v4l.org/TdMFF
      猜你喜欢
      • 2012-07-06
      • 1970-01-01
      • 2023-03-25
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      相关资源
      最近更新 更多