2013-10-04 197 views
3

我在使用LINQ从XML文件读取时遇到了麻烦。用LINQ读取XML节点

这里是我的XML文件

<?xml version="1.0" encoding="utf-8"?> 
<Employees> 
    <Employee> 
    <Name Type="First">Jack</Name> 
    <Name Type="Last">Black</Name> 
    </Employee> 
    <Employee> 
    <Name Type="First">John</Name> 
    <Name Type="Last">Blue</Name> 
    </Employee> 
    <Employee> 
    <Name Type="First">Dan</Name> 
    <Name Type="Last">Red</Name> 
    </Employee> 
    <Employee> 
    <Name Type="First">Patrick</Name> 
    <Name Type="Last">Green</Name> 
    </Employee> 
</Employees> 

我使用的代码如下

XElement doc = XElement.Load("xmldoc.xml"); 
    var query = from x in doc.Elements("Employee") where x.Element("Name").Attribute("Type").Value == "First" select x; 
    foreach (XElement item in query) 
    { 
     Console.WriteLine(item.Element("Name").Value); 
    } 

此代码返回我所有的名字,但是当我改变从第一属性值到最后说到空白。

当我切换名称节点时,它会重新命名姓氏。对我来说,它看起来像每个雇员查询返回名字节点的值,并忽略第二个。你能帮我解决这个问题吗?

+0

你真的想'Employee'在查询结果的要素,或者只是名字?如果你只是想要名字,那么你需要从名字中选择,而不是从员工中选择。否则,您需要转换结果(例如XPath)以过滤出您不需要的标签。或者你可以简单地离开了'where'干脆抓着你在你的'foreach'想要的标签:'Console.WriteLine(item.Elements(“名称”)单(I => i.Attribute(“类型” ).Value ==“Last”)。Value);' – mellamokb

回答

5

的问题是x.Element("Name")调用将返回第一个Name元素。实际上,您需要查询所有Name元素,并筛选具有Last属性值的元素。

试试这个:

var query = from x in doc.Elements("Employee").Elements("Name") 
      where x.Attribute("Type").Value == "Last" 
      select x; 

foreach (XElement item in query) 
{ 
    Console.WriteLine(item.Value); 
} 
+0

工程就像一个魅力,但有一个小问题。 只有当我使用XDocument打开XML文件而不是XElement时,您的代码才有效。 – user2847238

+0

@ user2847238对,我使用的是'XDocument',所以我添加了'Root'属性。我意识到你正在使用'XElement',所以不需要它。我更新了这个帖子,现在应该没问题。 –