【问题标题】:Escape characters in xml nodesxml节点中的转义字符
【发布时间】: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 用户将能看懂

标签: c# .net xml


【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-30
      • 2011-08-28
      • 1970-01-01
      • 2011-05-08
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      相关资源
      最近更新 更多