2016-08-12 70 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")); 
} 
相關問題