如何使用XmlDocument.LoadXml()加载包含&或<的字符串?是否需用Resolver?
首先得明确:你遇到的错误根本原因是原始字符串不符合XML语法规则——XML里的<、&、>、"、'属于特殊字符,不能直接出现在元素的文本内容里(标签本身的<除外),必须做转义处理,否则XmlDocument会判定这是无效XML,抛出解析异常。
下面给你两种可行的解决办法,以及关于Resolver的说明:
方法1:转义特殊字符
把字符串里的特殊字符替换成XML实体引用,这是最标准的做法:
&→&<→<>→>"→"'→'
比如你的例子,修改后应该是:
<choice id="A1"> sample < text</choice>
直接用这个转义后的字符串调用LoadXml()就能正常加载了。
如果你不想手动转义,可以用.NET自带的工具类自动处理,比如System.Security.SecurityElement.Escape()方法,专门用于XML内容的转义:
string originalText = "sample < text"; string escapedText = System.Security.SecurityElement.Escape(originalText); string xmlString = $"<choice id=\"A1\">{escapedText}</choice>"; XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlString);
方法2:使用CDATA段包裹特殊内容
如果你希望保留原始的特殊字符(比如后续读取时还能拿到<而不是<),可以把包含特殊字符的内容放在<![CDATA[...]]>标签里——CDATA段里的内容会被XML解析器当作纯文本,不会解析其中的特殊字符。
修改后的示例:
<choice id="A1"><![CDATA[ sample < text]]></choice>
这样调用LoadXml()也不会报错,读取元素内容时能直接获取到原始的sample < text。
关于Resolver的疑问
完全不需要使用Resolver!XmlResolver的作用是处理XML外部资源(比如外部DTD文件、实体引用文件),和元素内容里的特殊字符处理没有任何关系,这里用不上它。
XmlDocument能否处理这类情况?
当然可以!只要你的字符串符合XML语法规则(转义特殊字符或用CDATA包裹),XmlDocument完全能正常加载和解析这类内容。问题出在原始字符串本身不符合XML规范,不是XmlDocument的能力问题。
内容的提问来源于stack exchange,提问作者dyerme

