使用 C# 使用 XDocument 解析 XML [重复]

Posted

技术标签:

【中文标题】使用 C# 使用 XDocument 解析 XML [重复]【英文标题】:Parse XML with XDocument using C# [duplicate] 【发布时间】:2016-05-02 18:07:50 【问题描述】:

我有以下 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<html>
    <body>
        <p><p>
           <span class="screenitems">
               Close 
               <MCap:variable name="1052.zartzut"></MCap:variable> 
               without prompting if you launch a non-
               <MCap:variable name="zirtZat"></MCap:variable>
               measurement module. (You will be prompted to save any unsaved data.)
               <span lol="scs">dsfsfs</span>
            </span>
        </p></p>
    </body>
</html>

我只想删除&lt;span class="screenitems"&gt;和对应的结束标签&lt;/span&gt;,所以解析后应该是这样的:

<?xml version="1.0" encoding="utf-8"?>
<html>
    <body>
        <p><p>

               Close 
               <MCap:variable name="1052.zartzut"></MCap:variable> 
               without prompting if you launch a non-
               <MCap:variable name="zirtZat"></MCap:variable>
               measurement module. (You will be prompted to save any unsaved data.)
               <span lol="scs">dsfsfs</span>

        </p></p>
    </body>
</html>

&lt;span class="screenitems"&gt; 是唯一的唯一标签,所以在它和&lt;html&gt; 之间,你可以拥有一切。你能用C# 中的XDocument 方法帮助我解决这个问题吗?

【问题讨论】:

通常XDocument 以及任何其他 xml 解析器都不是解析 html 的最佳工具。原因是不需要的有效 html 代码将是有效的 xml。你最好使用一些 html 解析器,例如 html agility pack。 这与您的last question 有何不同?您应该只更新该问题而不是开始另一个问题。 @AndyKorneyev 这将在另一个程序中使用,它要求它是一个有效的 XML 文件。 @CharlesMager 我不知道不同的情况,我已经接受了答案。这就是为什么。 我不关注。您之前的问题没有被接受的答案,您对 cme​​ts 中的问题也没有回复。我在那里添加了一个答案。如果我要回答这个问题,我会给出同样的答案。 【参考方案1】:
static void Main(string[] args)
        
string html = @"<?xml version=""1.0"" encoding=""utf-8""?>
<html>
    <body>
        <p><p>
           <span class=""screenitems"">
               Close 
               <MCap:variable name=""1052.zartzut""></MCap:variable> 
               without prompting if you launch a non-
               <MCap:variable name=""zirtZat""></MCap:variable>
               measurement module. (You will be prompted to save any unsaved data.)
               <span lol=""scs"">dsfsfs</span>
            </span>
        </p></p>
    </body>
</html>";

        HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(html);

        var spanNode = doc.DocumentNode.Descendants().Where(x => x.Name == "span" && x.Attributes["class"].Value == "screenitems").First();

        var parent = spanNode.ParentNode;

        parent.RemoveChild(spanNode, true);

        Console.WriteLine(doc.DocumentNode.OuterHtml);

您应该使用 Html 解析器,在这里您可以如何使用 Html Agility Pack 来做到这一点。这里的窍门是parent.RemoveChild(Node, keepGrandChilds);

【讨论】:

以上是关于使用 C# 使用 XDocument 解析 XML [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Xdocument 进行简单的 Xml 解析

当数据集WriteXml()函数生成xml文件时,C#如何使用XDocument类更新xml文件

在 C# 中使用 XDocument 创建 XML 文件

使用 C# 和 XDocument/XElement 解析 Soap 响应

使用 C# 从 html 中删除自定义 xml 标签

无法使用 Xdocument 和 Linq 解析 xml 字符串