Kiq*_*net 4 c# xml linq linq-to-xml
我想使用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>
Run Code Online (Sandbox Code Playgroud)
我目前要从此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") { }
}
}
}
Run Code Online (Sandbox Code Playgroud)
优化此代码以过滤<confirmado>元素内容的最佳方法是什么?
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)
{
...
}
Run Code Online (Sandbox Code Playgroud)
兴趣点:
doc.Root.Elements("contact")仅选择<contact>文档根目录中的元素,而不是在整个文档中搜索<contact>元素.
该XElement.Element方法返回给定名称的第一个子元素.无需将子元素转换为列表并获取第一个元素.
所述的XElement和XAttribute类提供了多种选择的方便的转换运算符.