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;
实际上是转义字符。所有语言的所有 XML 序列化程序都将正确转义 &amp;
是的,这不是真正的 xml,而不是真正的 xml,因此 XML 工具不喜欢使用它也就不足为奇了。像@PanagiotisKanavos 一样,我强烈建议你在上游修复这个问题,这样你得到的是实际的 XML。
你说得对,我希望我能做到,但我是从其他来源获得的,我无法控制它。
&amp;
的转义序列是 &amp;
。 html 和 XML 中的转义序列以 &amp;
开头。您不能用 &amp;
替换字符串中的每个 &amp;
,因为这会破坏 valid 转义序列。你必须告诉制作这个的人来修复他们的错误。或者向他们收取处理费用。
一种可能的解决方法是替换被空格包围的 & 符号(例如 text.Replace(" & "," &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 &< test> </Name>
</Data>
但是,一旦您打开对这种格式错误的 XML 的输入,您就很容易遇到使用 XML 等 W3C 标准本应避免的误解和不兼容性或工具依赖性。
【讨论】:
【参考方案2】:由于您无法控制源,您可以尝试一些正则表达式使其成为有效的 xml:
string xml = @"<Data>
<Name>Test & test& &1 <aaa &</Name>
</Data>";
xml = Regex.Replace(xml,@"&(?!\w+;)","&");
这将返回
<Data>
<Name>Test & test& &1 <aaa &</Name>
</Data>
【讨论】:
&</Name>
会发生什么?
如果名称标签也包含
@MuhammadFaisal 然后你停止尝试修复其他人的完全损坏的字符串。这不再是 XML。你不能一直猜测是什么坏了
@PanagiotisKanavos 它将产生 &amp;</Name>
我更新了示例【参考方案3】:
呈现的 XML 格式不正确。
您可以使用 CData 部分 使您的 XML 格式正确。
每个<Name>
应该变成<Name><![CDATA[
每个</Name>
应该变成]]></Name>
格式良好的 XML
<Data>
<Name><![CDATA[Test & < test> ]]></Name>
</Data>
【讨论】:
以上是关于xml节点中的转义字符的主要内容,如果未能解决你的问题,请参考以下文章