我有一个包含 XML 的字符串,我只想将它解析为 Xelement,但它有一个 & 符号。我在使用 HtmlDecode 解析它时仍然遇到问题。有什么建议么?
string test = " <MyXML><SubXML><XmlEntry Element="test" value="wow&" /></SubXML></MyXML>";
XElement.Parse(HttpUtility.HtmlDecode(test));
我还添加了这些方法来替换那些字符,但我仍然收到 XMLException。
string encodedXml = test.Replace("&", "&").Replace("<", "<").Replace(">", ">").Replace("\"", """).Replace("'", "'");
XElement myXML = XElement.Parse(encodedXml);
t 或者甚至用这个尝试过:
string newContent= SecurityElement.Escape(test);
XElement myXML = XElement.Parse(newContent);
最佳答案
理想情况下,XML 在您的代码使用它之前被正确转义。如果这超出了您的控制范围,您可以编写一个正则表达式。不要使用 String.Replace 方法,除非您绝对确定这些值不包含其他转义项。
例如,"wow&".Replace("&", "&")
导致 wow&
,这显然是不可取的。
Regex.Replace 可以为您提供更多控制来避免这种情况,并且可以编写为仅匹配不属于其他字符的“&”符号,例如 <
,类似于:
string result = Regex.Replace(test, "&(?!(amp|apos|quot|lt|gt);)", "&");
以上有效,但不可否认它没有涵盖以 & 开头的各种其他字符,例如
并且列表可以增长。
一种更灵活的方法是解码值属性的内容,然后重新编码。如果您有 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/