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

本文关键字:使用 ReplaceWith 方法 问题 XElement 编码 XDocument | 更新日期: 2023-09-27 18:31:46

我有以下代码:

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);

当我获得匹配并使用XElement变量xelmReplaceWith方法替换加载到变量doc中的XML文件的内容时,XML文件的内容正在被编码,因此我没有像<p>这样的标签,而是得到&lt;p&gt

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

我已经在这里查看了一些解决方案,例如使用XElement.Parse方法或HTTPUtility.HtmlDecode,但我无法让它工作。它仍然像html一样编码。

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

虽然您可以尝试将正则表达式匹配解析为 XElement 来解决问题,但我认为您这样做的方式是错误的。

据我了解,您的要求是将span元素替换为screenItems类及其内容。与其使用 LINQ to XML 和 RegEx 的组合来执行此操作,不如坚持使用 LINQ to XML。

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

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

然后将其中每个替换为它们自己的内容:

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

有关工作示例,请参阅此小提琴。