按参数 c# 筛选我的 XML

本文关键字:我的 XML 筛选 参数 | 更新日期: 2023-09-27 18:33:10

我对通过 c# 在我的 XML 文件中搜索/过滤有疑问

我有一个大的XML文件,其中包含我国的不同学校:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<data-set xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <school>
        <schoolnummer>3699</schoolnummer>
        <vestigingsnummer>1</vestigingsnummer>
        <net>Vrij gesubsidieerd onderwijs</net>
        <naam>Vrije Basisschool -           Sint-Joris</naam>
        <hoofdzetel>J</hoofdzetel>
        <straat>Cellebroersstraat</straat>
        <huisnummer>16</huisnummer>
        <postcode>1000</postcode>
        <gemeente>BRUSSEL</gemeente>
        <crabcode>19636</crabcode>
        <crabhuisnr>16</crabhuisnr>
        <crabbusnr>     </crabbusnr>
        <telefoon>0471-76.32.05</telefoon>
        <email>pdedonder@sintjorisbasisschool.be</email>
        <url>www.sintjorisbasisschool.be</url>
        <familienaambeheerder>DE DONDER</familienaambeheerder>
        <voornaambeheerder>Peter</voornaambeheerder>
    </school>
    <school>
        <schoolnummer>3889</schoolnummer>
        <vestigingsnummer>1</vestigingsnummer>
        <net>Vrij gesubsidieerd onderwijs</net>
        <naam>Vrije Basisschool</naam>
        <hoofdzetel>J</hoofdzetel>
        <straat>John Waterloo Wilsonstraat</straat>
        <huisnummer>21</huisnummer>
        <postcode>1000</postcode>
        <gemeente>BRUSSEL</gemeente>
        <crabcode>19972</crabcode>
        <crabhuisnr>21</crabhuisnr>
        <crabbusnr>     </crabbusnr>
        <telefoon>02-230.75.28</telefoon>
        <fax>02-230.48.44</fax>
        <email>abeullens@tennude.be</email>
        <url>www.tennude.be</url>
        <familienaambeheerder>BEULLENS</familienaambeheerder>
        <voornaambeheerder>Ann</voornaambeheerder>
    </school>

对于我的项目,我需要通过搜索正确的<postcode>来找到所有<School>,例如"1000"。

最好的方法是什么?XMLReader/LINQ to XML?注意:这是一个非常大的 XML 文件。

按参数 c# 筛选我的 XML

我是 LINQ to XML 的忠实粉丝,但对于像您这样结构强、类似表的 XML 数据,我总是推荐XmlSerializer。它是比XDocument和XElement更专业,更高级的数据表示形式。

您可以定义一个名为 School 的 C# 类,用 [XmlRoot("school")] 标记它,为每个 XML 字段定义 C# 属性(即 public int schoolnummer { get; set; }等)并使用 XmlSerializer.Deserialize() 填充School对象。它通过 XML 中的元素名称自动查找 C# 属性(区分大小写!

如果您的 XML 文件太大而无法同时将所有内容保存在 RAM 中,则必须找到一种方法来反序列化对象并在您仍在搜索时将它们丢弃。

我这里有一个示例,可能会对您有所帮助。几个月前我对其进行了编程,并将XmlTextReaderXmlSerializer相结合,从users.xml中逐个读取TestUser对象并将它们添加到列表中。不完全是你想做的,但你可以调整它以满足你的需求:

private void _LoadUsers()
{
    _users = new List<TestUser>();
    string path = Path.Combine(_projectNamespace, "users.xml");
    var stream = new FileStream(path, FileMode.Open);
    var reader = new XmlTextReader(new StreamReader(stream));
    while (reader.ReadToFollowing("user"))
    {
        var serializer = new XmlSerializer(typeof(TestUser));
        _users.Add((TestUser)serializer.Deserialize(reader.ReadSubtree()));
    }
    stream.Close();
}