【问题标题】:how to remove a particular tag in xml without the loss of data in c#如何删除xml中的特定标签而不会丢失c#中的数据
【发布时间】:2012-05-27 22:44:18
【问题描述】:

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

我想删除所有&lt;p&gt;&lt;div&gt;&lt;span&gt; 标签。

需要输出:

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

任何人都可以建议如何使用 C# 来完成它。使用 XmlDocument。

【问题讨论】:

  • 你试过什么? SO 不是代码生成器——你也必须在这方面工作。
  • 您也可以尝试使用正则表达式。但是嵌套 div 会很困难。

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


【解决方案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;

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-02
      • 2020-03-22
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多