通过参数c#过滤我的XML

时间:2016-02-03 08:09:15

标签: c# xml linq

我对通过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>

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

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

1 个答案:

答案 0 :(得分:1)

我是LINQ to XML的忠实粉丝,但对于像你这样的结构化,类似表格的XML数据,我总是会推荐XmlSerializer。与XDocument和XElement相比,它是一种更专业,更高级别的数据表示。

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

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

我这里有一个可以帮助你的样本。几个月前我对它进行了编程,我将XmlTextReaderXmlSerializer合并,逐一从TestUser读取users.xml个对象,并将它们添加到列表中。不完全是你想做的,但你可以根据自己的需要进行调整:

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