使用ReplaceWith方法时,使用XDocument XElement编码问题

时间:2016-01-25 20:14:01

标签: c# html regex xml linq-to-xml

我有以下代码:

XDocument doc = XDocument.Load(file);
var x = doc.Descendants("span");

XElement xelm = x.FirstOrDefault(xm => xm.Attribute("class").Value=="screenitems");

Regex rgx = new Regex("^<span class=\"screenitems\">(.*)</span>$");
Match mtc = rgx.Match(xelm.Value);
if (mtc.Success)
{
    xelm.ReplaceWith(mtc.Groups[1].Value);
}
doc.Save(file);

当我获得匹配并使用doc变量ReplaceWith的{​​{1}}方法替换加载到变量XElement中的XML文件的内容时, XML文件正在编码,因此我没有xelm这样的标记,而是<p>

那么如何防止它编码为html但实际上替换为匹配的正则表达式?

我在这里查看了一些解决方案,例如使用&lt;p&gt方法或XElement.Parse,但我无法使其工作。它仍然像html一样编码。

1 个答案:

答案 0 :(得分:1)

虽然您可以尝试将您的RegEx匹配解析为XElement来解决问题,但我认为您正在以错误的方式解决这个问题。

据我了解,您的要求是将span类替换为screenItems类及其内容。而不是使用LINQ to XML和RegEx的组合,你应该坚持使用LINQ to XML。

使用span类找到所有screenItems元素:

var spans = doc.Descendants("span")
    .Where(e => (string)e.Attribute("class") == "screenItems")
    .ToList();

然后用自己的内容替换每一个:

foreach (var span in spans)
{
    span.ReplaceWith(span.Nodes());
}

有关工作示例,请参阅this fiddle