微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 C# 中过滤 XmlDocument xml 的最快方法

我有一个包含以下 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 并且类型设置为 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']

解决方法

尝试以下操作:

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

        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。