如何删除xml中的特定标记而不会丢失c#中的数据

时间:2012-05-21 12:19:12

标签: c# c#-4.0 linq-to-xml xmldocument

我正在使用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。

2 个答案:

答案 0 :(得分:1)

使用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;

答案 1 :(得分:0)

这是一个相当简单的正则表达式。

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,用于删除标签之间的所有空格。

正则表达式的模式是

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

或者您可以使用“。*”而不是“*”来确定替换所有换行符或标签之间可能剩余的其他特殊字符