c# - 使用 & 符号解析 XML

标签 c# xml xelement

我有一个包含 XML 的字符串,我只想将它解析为 Xelement,但它有一个 & 符号。我在使用 HtmlDecode 解析它时仍然遇到问题。有什么建议么?

string test = " <MyXML><SubXML><XmlEntry Element="test" value="wow&" /></SubXML></MyXML>"; 

XElement.Parse(HttpUtility.HtmlDecode(test));

我还添加了这些方法来替换那些字符,但我仍然收到 XMLException。

string encodedXml = test.Replace("&", "&amp;").Replace("<", "&lt;").Replace(">", "&gt;").Replace("\"", "&quot;").Replace("'", "&apos;");
XElement myXML = XElement.Parse(encodedXml);

t 或者甚至用这个尝试过:

string newContent=  SecurityElement.Escape(test);
XElement myXML = XElement.Parse(newContent);

最佳答案

理想情况下,XML 在您的代码使用它之前被正确转义。如果这超出了您的控制范围,您可以编写一个正则表达式。不要使用 String.Replace 方法,除非您绝对确定这些值不包含其他转义项。

例如,"wow&".Replace("&", "&") 导致 wow&amp;,这显然是不可取的。

Regex.Replace 可以为您提供更多控制来避免这种情况,并且可以编写为仅匹配不属于其他字符的“&”符号,例如 <,类似于:

string result = Regex.Replace(test, "&(?!(amp|apos|quot|lt|gt);)", "&amp;");

以上有效,但不可否认它没有涵盖以 & 开头的各种其他字符,例如   并且列表可以增长。

一种更灵活的方法是解码值属性的内容,然后重新编码。如果您有 value="&wow&",解码过程将返回 "&wow&",然后重新编码将返回 "&wow&",这是可取的。要做到这一点,你可以使用这个:

string result = Regex.Replace(test, @"value=\""(.*?)\""", m => "value=\"" +
    HttpUtility.HtmlEncode(HttpUtility.HtmlDecode(m.Groups[1].Value)) +
    "\"");
var doc = XElement.Parse(result);

请记住,上述正则表达式仅针对 value 属性的内容。如果 XML 结构中的其他区域遇到同样的问题,则可以对其进行调整以匹配它们并以类似的方式替换它们的内容。


编辑:更新的解决方案应该处理标签之间的内容以及双引号之间的任何内容。请务必对此进行彻底测试。尝试使用正则表达式操作 XML/HTML 标签并不受欢迎,因为它容易出错且过于复杂。您的箱子有些特殊,因为您需要先对其进行 sanitizer 才能使用它。

string pattern = "(?<start>>)(?<content>.+?(?<!>))(?<end><)|(?<start>\")(?<content>.+?)(?<end>\")";
string result = Regex.Replace(test, pattern, m =>
            m.Groups["start"].Value +
            HttpUtility.HtmlEncode(HttpUtility.HtmlDecode(m.Groups["content"].Value)) +
            m.Groups["end"].Value);
var doc = XElement.Parse(result);

关于c# - 使用 & 符号解析 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1473826/

相关文章:

c# - XmlSerializer 和 xsi : deserialization

Android Tab内容与选项卡重叠

c# - 使用 LINQ 从 XML 中选择多个节点

c# - 在 C# 单元测试中向模拟数据库添加数据的方法

c# - Easyhook:如何从使用 LoadLibrary 加载的 DLL 中 Hook 函数

c# - 对于二维数组,Array.Copy() 是否比 for 循环更快?

php - 包装一组 XML 节点

java - 合并 XSD 描述

c# - 如何使用 XElement 在 C# 中使用 List 序列化对象?

xml - 如何在不将其加载到内存和使用 XElement 的情况下读取大型 xml 文件