2010-12-01 4 views
4

XML文書から高性能なXML要素をフィルタリングしたいと考えています。XDocumentをより効率的にフィルタリングする

例えば接点と、この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") { } 
     } 
    } 
} 

:この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>[email protected]</email> 
    <confirmado>SI</confirmado> 
    </contact> 
    <contact type="1" id="2"> 
    <name>Name2</name> 
    <email>[email protected]</email> 
    <confirmado>Sin confirmar</confirmado> 
    </contact> 
</contaclist> 

私の現在のコードを<confirmado>要素の内容は?

答えて

9
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 methodは、指定された名前の最初の子要素を返します。子要素をリストに変換して最初の要素を取る必要はありません。

  • ​​およびXAttributeクラスは、convenient conversion operatorsの幅広い選択肢を提供します。

+0

クエリが結果を得ることはありません:?? '(問題はおそらく、ファイルが完全にXMLではない、 Kiquenet

+0

@alhambraeidos:固定します。 – dtb

0

あなたはLINQ使用することができます興味のある

foreach (XElement element in doc.Descendants("contact").Where(c => c.Element("confirmado").Value == "SI")) 
関連する問題