2016-08-12 43 views
1

我有一个XML文件,它看起来像这样选择给定节点,LINQ的所有属性和它的价值为xml

<?xml version="1.0" encoding="utf-8"?> 
<Content> 
    <Field Title="XYZ"> 
    <Description>Numeric</Description> 
    <Comment>12345</Comment> 
    </Field> 
<Field Title="ABC"> 
    <Description>Alphabetic</Description> 
    <Comment>QWERTY</Comment> 
    </Field> 
<Field Title="XYZ"> 
    <Description>Alphabetic</Description> 
    <Comment>QWERTY</Comment> 
    </Field> 
</Content> 

我想提取的<Description>节点值和<Comment> ,根据属性Title自带Value='XYZ'

我想是这样的使用LINQ to XML,但是没有得到预期的结果

string Xmlpath = @"d:\Test.xml"; 
XDocument mappings = XDocument.Load(Xmlpath); 
var Data = from elm in mappings.Descendants("Field") 
      where (string)elm.Attribute("Title") == "XYZ" 
      select elm; 

有人可以帮助我吗?

回答

1

这会给你一个集合了所有这些指定的元素为你:

var result = XDocument.Load(XmlPath).Root 
         .Descendants("Field") 
         .Where(element => element.Attribute("Title") == "XYZ") 
         .Descendants() 
         .Where(element => element.Name == "Description" || 
             element.Name == "Comment") 
         .Select(element => element.Value).ToList(); 
+1

注意,'.'是C#? 6.0和OP用C#4.0标记问题。 – Tim

+1

OP使用的代码对于NRE也是安全的:'(string)elm.Attribute(“Title”)==“XYZ”' – har07

+0

@Jithin j - 是否解决了您的问题? –

0

你已经设法匹配在Data变量“标题”属性值条件的<Field>元素。接下来,你可以使用Element()得到<Field>的子元素:

var result = Data.FirstOrDefault(); 
if(result != null) 
{ 
    Console.WriteLine((string)result.Element("Description")); 
    Console.WriteLine((string)result.Element("Comment")); 
} 

或者,使用foreach如果可以有多个<Field>元素相匹配的标准:

foreach(result in Data) 
{ 
    Console.WriteLine((string)result.Element("Description")); 
    Console.WriteLine((string)result.Element("Comment")); 
} 
相关问题