【问题标题】:Encoding problems with XDocument XElement when using ReplaceWith method使用 ReplaceWith 方法时 XDocument XElement 的编码问题
【发布时间】:2026-02-15 13:00:02
【问题描述】:

我有以下代码:

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 变量ReplaceWithReplaceWith 方法获得匹配并替换加载到变量doc 中的XML 文件的内容时,XML 文件的内容正在被编码,所以改为有一个像&lt;p&gt; 这样的标签我得到&amp;lt;p&amp;gt

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

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

【问题讨论】:

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


【解决方案1】:

虽然您可以尝试将您的 RegEx 匹配解析为 XElements 以解决问题,但我认为您的做法是错误的。

据我了解,您的要求是将 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());
}

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

【讨论】:

  • 对不起,我没有看到你的答案。我会尝试看看它是否有效。谢谢。