如何使用 php 转换 xml 中的特殊字符


How to convert special characters in xml using php?

这个问题有很多帖子。我已经经历了所有这些,但我没有得到我预期的解决方案。我需要将 XML 中的特殊字符转换为 html 实体。

我试过了

<?php
$xml="<test>This is a xml file which has special characters < > & in it</test>";
htmlspecialchars($xml, ENT_XML1, 'UTF-8');//it replaces xml tags too
?>

预期的输出 XML 字符串:

<test>This is a xml file which has special characters &lt; $gt; &amp; in it</test>

这个问题有很多帖子。我已经经历了所有这些,但我没有得到我预期的解决方案。

是的,您认为您询问的主题已经定义明确,并且已经在此网站上得到了很好的涵盖。但是,这并不能防止犯错误,因为它每天都在最佳使用中发生。

您在代码示例中编写:

这是一个具有特殊字符的 xml 文件

你给出以下字符串:

<test>This is a xml file which has special characters < > & in it</test>

但是你写的是错误的。这不是 XML 文件,因为它的格式不正确

所以这是发生的第一个错误。

您在问题中遇到的下一个错误是,您对整个字符串应用转换函数,尽管您只想将其应用于该字符串的一小部分,即这三个字符:

  1. 偏移量 54 处的<
  2. 偏移量 56 处>(技术上这不需要变成&gt;
  3. 偏移量 58 处的&

因此,您只需要在这些部分应用该功能。只是一个示例代码来演示这一点,您不应该希望将其作为"解决方案",这是用于演示:

foreach ([58, 56, 54] as $offset)
{
    $encoded = htmlspecialchars($xml[$offset], ENT_XML1, 'UTF-8');
    $xml = substr_replace($xml, $encoded, $offset, 1);
}

如本例所示,您选择的编码函数并非全错,它正确地编码了您要求的字符:

<test>This is a xml file which has special characters &lt; &gt; &amp; in it</test>

(还有其他可以想象的方法,例如利用CData部分<test><![CDATA[This is a xml file which has special characters < > & in it]]></test>但这不是这里的重点。

然而,由于所有这些错误和由此造成的混乱,这并不意味着在Stackoverflow上我们没有明确的问答材料。

通过识别所犯的错误来消除混乱,有一个参考资料库,您可以从中选择您选择的武器:

  • 使用 PHP 读取格式错误的 XML(未编码的 XML 实体)(2009 年 6 月)
  • 在使用 DOMDocument 函数处理之前修复 PHP 中格式错误的 XML(2010 年 2 月)
  • 如何修复格式错误的 XML?(2010年9月)

如您所见,有一个更大的问题和答案列表,并且根据第一次分析,您的XML出了什么问题,它不是XML,但可能会成为XML,因为它在视觉上接近它,您应该能够找到一种您可能最喜欢的方法来修复它。

我个人是 PHP 中 Tidy 扩展的粉丝,它可以完成您在您的情况下正在寻找的工作:

tidy_repair_string($xml, ['input-xml' => 1, 'output-xml' => 1, 'wrap' => 0]);

您可能希望以不同的方式执行此操作。请参阅上面的链接问题作为更好搜索词的开始,并查看其他人对此主题的询问和回答。