如何在不丢失 C# 数据的情况下删除 XML 中的特定标记

本文关键字:XML 删除 情况下 数据 | 更新日期: 2023-09-27 18:34:54

我正在使用c#处理XML文档。

<data>
    <single>
        <p xmlns="http://www.w3.org/1999/xhtml">
            <strong>Hi hello bbvahvgxvzhavxhgsavxv</strong>
        </p>
        <p xmlns="http://www.w3.org/1999/xhtml">
            <strong>dmcdnsbcdbn</strong>
        </p>
    </single>
    <single>
        <div xmlns="http://www.w3.org/1999/xhtml">
            <strong>Hi hello bbvahvgxvzhavxhgsavxv</strong>
        </div>
        <span xmlns="http://www.w3.org/1999/xhtml">
            <strong>dmcdnsbcdbn</strong>
        </span>
    </single>
</data>

我想删除所有<p><div><span>标签。

所需输出:

<data>
    <single>
        <strong>Hi hello bbvahvgxvzhavxhgsavxv</strong>
        <strong>dmcdnsbcdbn</strong>
    </single>
    <single>
        <strong>Hi hello bbvahvgxvzhavxhgsavxv</strong>
        <strong>dmcdnsbcdbn</strong>
    </single>
</data>

任何人都可以建议如何使用 C# 来做到这一点。 使用 XmlDocument。

如何在不丢失 C# 数据的情况下删除 XML 中的特定标记

使用 HtmlAgilityPack,可以按如下方式完成:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(xml);
doc.DocumentNode
    .Descendants("strong")
    .ToList().ForEach(n => n.ParentNode.ParentNode.RemoveChild(n.ParentNode, true));
var newXml = doc.DocumentNode.InnerHtml;
这是一个

看起来相当简单的正则表达式。

string tmp = xmlDoc.DocumentElement.InnerXml;
tmp = Regex.Replace(tmp, "<p.*>|</p>|<div.*>|</div>|<span.*>|</span>", "");
XmlDocument newDoc = new XmlDocument();
newDoc.LoadXml(tmp);

这将保留数据(标签之间的所有内容(,但删除标签本身。 注意:这可能会弄乱文档中的某些格式(大量空格(,但它仍然应该可用。

在您给出的示例上运行此语句后,这是输出。

<data>
    <single>
            <strong>Hi hello bbvahvgxvzhavxhgsavxv</strong>

            <strong>dmcdnsbcdbn</strong>
    </single>
    <single>
            <strong>Hi hello bbvahvgxvzhavxhgsavxv</strong>

            <strong>dmcdnsbcdbn</strong>
    </single>
</data>

我不确定您是否喜欢,您可能想运行.Trim((,甚至是辅助正则表达式,旨在在尝试加载之前删除字符串上标签之间的所有空格。

正则表达式模式将是

Regex.Replace(string, "(>) *(<)", "$1$2");

或者,您可以使用".*"而不是"*"来确保替换所有换行符或标签之间可能残留的其他特殊字符