Фильтр XDocument более эффективно - PullRequest
4 голосов
/ 02 декабря 2010

Я хотел бы отфильтровать с помощью высокопроизводительных элементов XML из документа XML.

Возьмем, к примеру, этот XML-файл с контактами:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="asistentes.xslt"?>
<contactlist evento="Cena Navidad 2010" empresa="company">
  <contact type="1" id="1">
    <name>Name1</name>
    <email>xxxx@zzzz.es</email>
    <confirmado>SI</confirmado>
  </contact>
  <contact type="1" id="2">
    <name>Name2</name>
    <email>xxxxxxxxx@zzzze.es</email>
    <confirmado>Sin confirmar</confirmado>
  </contact>
</contaclist>

Мой текущий код для фильтрации из этого XML-документа:

using System; 
using System.Xml.Linq; 

class Test 
{ 
   static void Main() 
   { 
      string xml = @" the xml above"; 
      XDocument doc = XDocument.Parse(xml); 

      foreach (XElement element in doc.Descendants("contact")) {
         Console.WriteLine(element);
         var id = element.Attribute("id").Value;
         var valor = element.Descendants("confirmado").ToList()[0].Value;
         var email = element.Descendants("email").ToList()[0].Value;
         var name = element.Descendants("name").ToList()[0].Value;
         if (valor.ToString() == "SI") { }
      }
   } 
} 

Как лучше всего оптимизировать этот код для фильтрации <confirmado> содержимого элемента?

Ответы [ 2 ]

9 голосов
/ 02 декабря 2010
var doc = XDocument.Parse(xml); 

var query = from contact in doc.Root.Elements("contact")
            let confirmado = (string)contact.Element("confirmado")
            where confirmado == "SI"
            select new
            {
                Id    = (int)contact.Attribute("id"),
                Name  = (string)contact.Element("name"),
                Email = (string)contact.Element("email"),
                Valor = confirmado
            };

foreach (var contact in query)
{
    ...
}

Достопримечательности:

  • doc.Root.Elements("contact") выбирает только элементы <contact> в корне документа вместо поиска по всему документу элементов <contact>.

  • Метод XElement.Element возвращает первый дочерний элемент с заданным именем.Нет необходимости преобразовывать дочерние элементы в список и брать первый элемент.

  • Классы XElement и XAttribute предоставляют широкий выбор удобные операторы преобразования .

0 голосов
/ 02 декабря 2010

Вы можете использовать LINQ:

foreach (XElement element in doc.Descendants("contact").Where(c => c.Element("confirmado").Value == "SI"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...