【问题标题】:Filter XDocument more efficiently更有效地过滤 XDocument
【发布时间】:2010-12-01 21:36:01
【问题描述】:

我想使用来自 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") { }
      }
   } 
} 

优化此代码以过滤&lt;confirmado&gt; 元素内容的最佳方法是什么?

【问题讨论】:

    标签: c# xml linq linq-to-xml


    【解决方案1】:
    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") 仅选择文档根中的 &lt;contact&gt; 元素,而不是在整个文档中搜索 &lt;contact&gt; 元素。

    • XElement.Element method 返回具有给定名称的第一个子元素。无需将子元素转换为列表并获取第一个元素。

    • XElement 和 XAttribute 类提供了广泛的 convenient conversion operators 选择。

    【讨论】:

    • 查询没有得到结果 :'( 问题可能是文件不是完整的 xml,是带有
    【解决方案2】:

    你可以使用 LINQ:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      • 2011-01-09
      • 1970-01-01
      • 2016-05-11
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多