在 C# 中过滤 XmlDocument xml 的最快方法

Posted

技术标签:

【中文标题】在 C# 中过滤 XmlDocument xml 的最快方法【英文标题】:Fastest method to filter XmlDocument xml in C# 【发布时间】:2021-09-18 00:08:32 【问题描述】:

我有一个包含以下 xml 的 XmlDocument 对象:

<xml>
    <People>
        <Person>
            <FirstName>John</FirstName>
            <Surname>Smith</Surname>
            <Type>A</Type>
        </Person>
        <Person>
            <FirstName>Bill</FirstName>
            <Surname>Smith</Surname>
            <Type>B</Type>
        </Person>
        <Person>
            <FirstName>Chad</FirstName>
            <Surname>Smith</Surname>
            <Type>B</Type>
        </Person>
        <Person>
            <FirstName>Tina</FirstName>
            <Surname>Johnson</Surname>
            <Type>B</Type>
        </Person>
    </People>
</xml>

我想将 Surname 节点设置为 Smith 且 Type 设置为 B 的 xml 过滤到另一个 XMLDocument 对象中,如下所示:

<xml>
    <People>
        <Person>
            <FirstName>Bill</FirstName>
            <Surname>Smith</Surname>
            <Type>B</Type>
        </Person>
        <Person>
            <FirstName>Chad</FirstName>
            <Surname>Smith</Surname>
            <Type>B</Type>
        </Person>
    </People>
</xml>

用上面提到的 C# 标准过滤我的 xml 的最简单/最快的方法是什么?有没有办法在 Linq 中做到这一点?我尝试使用 SelectNodes 和 XPath,但不确定如何正确编写 XPath 表达式。

谢谢!

编辑:想通了:

descendant::Person[Surname='Smith' and Type='B']

【问题讨论】:

【参考方案1】:

尝试以下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication193

    class Program
    
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        
            XDocument doc = XDocument.Load(FILENAME);
            XElement people = doc.Descendants("People").FirstOrDefault();

            List<XElement> smith = people.Elements("Person").Where(x => (string)x.Element("Surname") == "Smith").ToList();

            people.ReplaceAll(smith);

        
    

【讨论】:

感谢您的建议!你错过了我也检查类型的地方。我还想出了如何使用似乎可行的 xpath 表达式! descendant::Person[Surname='Smith' and Type='B']

以上是关于在 C# 中过滤 XmlDocument xml 的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中使用 XmlDocument 和 XmlNode 修改现有 XML 文件

C#下使用XmlDocument详解

[C#]在 XMLDocument 中添加 XSL 引用

如何在 c# .net CF 3.5 中使用 XmlDocument 向 xml 添加属性

将带有“&”的 XML 读入 C# XMLDocument 对象

将 XML 文件读入 XmlDocument