2010-12-01 95 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 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> 

我當前的代碼從這個XML文檔過濾<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,XSLT是用 Kiquenet 2010-12-01 22:12:22

0

你可以使用LINQ:

foreach (XElement element in doc.Descendants("contact").Where(c => c.Element("confirmado").Value == "SI"))