c# – 使用&符号解析XML

我有一个包含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);

Ť
或者甚至尝试这样做:

string newContent=  SecurityElement.Escape(test);
XElement myXML = XElement.Parse(newContent);
最佳答案
理想情况下,XML在您的代码消耗之前正确转义.如果这超出了你的控制范围,你可以写一个正则表达式.不要使用String.Replace方法,除非您绝对确定值不包含其他转义项.

例如,“wow& amp; amp;”.替换(“&”,“& amp;”)导致哇& amp;这是显而易见的.

Regex.Replace可以给你更多的控制,以避免这种情况,并且可以写入只匹配“&”符号不是其他字符的一部分,例如& lt;

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

上述作品,但诚然不包括以&符号开头的其他字符的种类,例如&并且列表可以增长.

更灵活的方法是解码value属性的内容,然后对其进行重新编码.如果你有值=“& wow& amp; amp”解码过程将返回“& wow&”那么重新编码就会返回“& amp; amp; amp; amp; amp”,这是可取的.要拉这个,你可以用这个:

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标签是不利的,因为它可能容易出错,过于复杂.您的病例有些特别,因为您需要首先对其进行清洁才能使用它.

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 - 代码日志