2016-02-03 2 views
-2

У меня есть вопрос о поиске/фильтрации в моем файле XML с помощью C#Фильтрация мой XML с помощью параметра C#

У меня есть большие 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>[email protected]</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>[email protected]</email> 
     <url>www.tennude.be</url> 
     <familienaambeheerder>BEULLENS</familienaambeheerder> 
     <voornaambeheerder>Ann</voornaambeheerder> 
    </school> 

Для I моего проекта нужно найти все <School> s, ища подходящее <postcode>, например '1000'.

Каков наилучший способ для этого? XMLReader/LINQ to XML? Примечание. Это очень большой XML-файл.

+1

Вы что-то попробовали? –

+0

Начните здесь и посмотрите, куда он идет ... [LINQ to XML] (https://msdn.microsoft.com/en-us/library/bb387098.aspx), но да .. Возможно. – rmjoia

+0

возможно, это помогает ... https://msdn.microsoft.com/en-us/library/bb943906.aspx Предыдущий комментарий также является самым простым способом –

ответ

1

Я большой поклонник LINQ to XML, но для сильно структурированных табличных данных XML, подобных вашим, я всегда рекомендую XmlSerializer. Это гораздо более специализированное, высокоуровневое представление ваших данных, чем XDocument и XElement.

Вы можете определить C# класс с именем School, отметьте его [XmlRoot("school")], определить C# свойства для каждого поля XML (т.е. public int schoolnummer { get; set; } и т.д.) и заполнить ваши School объекты с помощью XmlSerializer.Deserialize(). Он автоматически находит ваши свойства C# по именам элементов в XML (с учетом регистра!).

И если ваш XML-файл слишком велик, чтобы одновременно хранить все в ОЗУ, вам необходимо найти способ десериализации объектов и выбросить их, пока вы все еще ищете.

У меня есть образец, который может вам помочь. Я запрограммировал его несколько месяцев назад, и я объединил XmlTextReader с XmlSerializer, чтобы читать 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(); 
} 
Смежные вопросы