xml节点中的转义字符

Posted

技术标签:

【中文标题】xml节点中的转义字符【英文标题】:Escape characters in xml nodes 【发布时间】:2021-10-24 16:31:31 【问题描述】:

我在字符串变量中有一个这样的xml(从文件加载)

<Data>
    <Name>Test & <  test> </Name>
</Data>

当我尝试加载此 xml 时出现异常“解析节点时发生错误”。我认为这是由于 & 在名称标签中。我在互联网上进行了搜索,但所有解决方案(例如SecurityElement.Escape)都转义了主要的 xml 元素,例如大于 gt 小于 lt,我只想替换 & 在我的情况下。我可以遍历 xml 并只替换数据部分,但有什么最短的方法吗?

【问题讨论】:

那是无效的 XML。修复产生这个的代码。没有序列化程序会接受&amp;amp;&amp;amp; 实际上是转义字符。所有语言的所有 XML 序列化程序都将正确转义 &amp;amp; 是的,这不是真正的 xml,而不是真正的 xml,因此 XML 工具不喜欢使用它也就不足为奇了。像@PanagiotisKanavos 一样,我强烈建议你在上游修复这个问题,这样你得到的是实际的 XML。 你说得对,我希望我能做到,但我是从其他来源获得的,我无法控制它。 &amp;amp; 的转义序列是 &amp;amp;html 和 XML 中的转义序列以 &amp;amp; 开头。您不能用 &amp;amp; 替换字符串中的每个 &amp;amp;,因为这会破坏 valid 转义序列。你必须告诉制作这个的人来修复他们的错误。或者向他们收取处理费用。 一种可能的解决方法是替换被空格包围的 & 符号(例如 text.Replace(" &amp; "," &amp;amp; ") 但显然这不会处理所有情况。您必须向您的经理或客户明确说明您重新处理其他人的 critical 错误(XML 并不是什么新鲜事),如果失败,您将不承担任何责任。毕竟,该 XML 的 none 用户将能看懂 【参考方案1】:

AngleSharp 有一个错误纠正“XML”解析器,它的工作方式更像 HTML5 或标签汤解析器,试图纠正和修复此类标记错误。为您的样品

using System;
using AngleSharp.Xml;
using AngleSharp.Xml.Parser;

namespace AngleSharpMalFormedXmlTest1

    class Program
    
        static void Main(string[] args)
        
            var malFormedXml =  @"<Data>
    <Name>Test & <  test> </Name>
</Data>";

            var doc = new XmlParser(new XmlParserOptions()  IsSuppressingErrors = true ).ParseDocument(malFormedXml);

            Console.WriteLine(doc.ToMarkup());
        
    

我明白了

<Data>
    <Name>Test &amp;&lt;  test&gt; </Name>
</Data>

但是,一旦您打开对这种格式错误的 XML 的输入,您就很容易遇到使用 XML 等 W3C 标准本应避免的误解和不兼容性或工具依赖性。

【讨论】:

【参考方案2】:

由于您无法控制源,您可以尝试一些正则表达式使其成为有效的 xml:

string xml = @"<Data>
    <Name>Test & test&amp; &1 &lt;aaa &</Name>
</Data>";

xml = Regex.Replace(xml,@"&(?!\w+;)","&amp;");

这将返回

<Data>
    <Name>Test &amp; test&amp; &amp;1 &lt;aaa &amp;</Name>
</Data>

【讨论】:

&amp;&lt;/Name&gt; 会发生什么? 如果名称标签也包含 @MuhammadFaisal 然后你停止尝试修复其他人的完全损坏的字符串。这不再是 XML。你不能一直猜测是什么坏了 @PanagiotisKanavos 它将产生 &amp;amp;&lt;/Name&gt; 我更新了示例【参考方案3】:

呈现的 XML 格式不正确。

您可以使用 CData 部分 使您的 XML 格式正确。

每个&lt;Name&gt; 应该变成&lt;Name&gt;&lt;![CDATA[ 每个&lt;/Name&gt; 应该变成]]&gt;&lt;/Name&gt;

格式良好的 XML

<Data>
    <Name><![CDATA[Test & <  test> ]]></Name>
</Data>

【讨论】:

以上是关于xml节点中的转义字符的主要内容,如果未能解决你的问题,请参考以下文章

在 XML 中创建文本节点时避免转义字符实体引用

如何转义xml中的特殊字符

【求助】Dom4j 生成xml,节点增加属性时,属性值中有特殊字符,如何做到不转义

使用 Python 转义 XML 中的未转义字符

XML中的转义字符

[转]xml文件中的转义字符