解析的XML中的HTML符号

Itarato

请使用以下XML代码段:

<title>Foos&#146; bar</title>

当我使用PHP的DOMDocument解析完整文档时:

<?php
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->loadXML($xml);
$dom->saveHTML(); // Output: <title>Foos&#146; bar</title>
?>

我可以看到所有内容,标题中有HTML符号。

然后我要提取标题文本:

<?php
$xpath = new DOMXpath($dom);
$xpath->query('//title')->item(0)->nodeValue); // Output: Foos bar
?>

即使调试和检查$xpath->query('//title')->item(0)对象,也看不到HTML符号。我试图更改编码,XML版本和解析选项,但是没有运气。

另外,我不确定XML标记解释的规则是什么,但我直觉会解析HMLT符号,因为它是有意义的标记。如果我手动将XML更改为:

<title><![CDATA[Foos&#146; bar]]></title>

那么一切都非常完美,我可以在最终结果中访问我的HTML符号。不幸的是,在这种情况下,我无法控制XML源。

你有什么主意吗?除了在解析之前使用正则表达式替换符号之外?

哈克雷

&#146;是无效的数字字符引用。您需要更换它。

但是,好消息是,您不需要自己全部替换它。

这些数字实体早于HTML / XML中的某个时间,在该时间中这些数字字符引用所涉及的字符集尚未全局定义。由于是HTML 4和XML 1.0,因此使用Unicode通用字符集(UCS)的代码点。

如果您有这样的坏数据或更旧的数据,可以让Tidy为您进行清理工作:

$xml = '<title>Foos&#146; bar</title>';

$config = [
    'input-xml'  => true,
    'output-xml' => true,
    'newline'    => 'LF',
];

$xml = tidy_parse_string($xml, $config);

$dom = new DOMDocument();

$dom->loadXML($xml);

echo $dom->saveHTML();

输出:

<title>Foos&rsquo; bar</title>

然后,Tidy对象也会发出一个警告。

警告:替换无效的数字字符引用146

这正是我们使用它的原因。

如果您想了解更多信息,此页面上列出的电子邮件可能对您很有趣。如果Tidy对您不起作用,这也可能向您显示了如何自己进行操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章