2012-04-27 77 views
0

我需要一些關於LINQ和XML的幫助。我讀過很多文章,但似乎無法找到我正在尋找的內容,因爲大多數人都在循環查看結果以獲取值。我有以下XML,我需要首先訪問基於節名稱,然後在控制ID上的特定元素。linq query to element w/o foreach

<formData> 
    <section name="SectionA"> 
     <control id="Textbox1" type="TextBox"> 
      <value>Value1</value> 
     </control> 
     <control id="Textbox2" type="TextBox"> 
      <value>Value2</value> 
     </control> 
     <control id="Textbox3" type="TextBox"> 
      <value>Value2</value> 
     </control> 
    </section> 
    <section name="SectionB" /> 
    <section name="SectionC" /> 
    <section name="SectionD" /> 
    <section name="SectionE" /> 
</formData> 

我正在使用下面的代碼來獲取我需要的元素。

IEnumerable<XElement> fields = xDocument.Element("formData").Elements("section") 
     .Where(m => m.Attribute("name").Value == "SectionA") 
     .Single() 
     .Elements("control") 
     .Where(f => f.Attribute("id").Value == "Control1"); 

導致以下元素:

<control id="Textbox1" type="TextBox"> 
    <value>Value1</value> 
</control> 

然而,這隻要我能...我需要三個獨立的值,編號,類型和價值。如何在不使用foreach或嵌套的foreach循環的情況下解決此問題?

謝謝

+0

因此,您唱匿名類型,我可以訪問這些字段: * fields.ElementAt(0)* OR * fields.FirstOrDefault()*還是有更好的方法嗎?謝謝Mike – Mike 2012-04-27 04:31:51

+0

對於匿名類型,字段類型爲IEnumerable 。要訪問每個字段,可以遍歷每個控件並訪問Id,Type和Value屬性。如果您只想要第一個元素,請調用fields.FirstOrDefault()以獲取第一個元素。 – JKor 2012-04-27 15:56:02

回答

1

,如果您使用匿名類型是好的,你可以這樣做:

var fields = xDocument.Element("formData").Elements("section") 
    .Where(m => m.Attribute("name").Value == "SectionA") 
    .Single() 
    .Elements("control") 
    .Where(f => f.Attribute("id").Value == "Control1").Select(f => new 
{ 
    Id = f.Attribute("id"), 
    Type = f.Attribute("type"), 
    Value = f.Element("value").Value 
}); 
+0

謝謝你的幫助。 – Mike 2012-04-27 15:53:55

0

試試這個:

xdoc.Descendants("section") 
    .Where(m => m.Attribute("name").Value == "SectionA") 
    .Single() 
    .Descendants("control") 
    .Where(f => f.Attribute("id").Value == "Textbox1") 
    .Select(f => new 
        { Id = f.Attribute("id").Value, 
        Type = f.Attribute("type").Value, 
        Value = f.Element("value").Value }); 

不過我會更傾向於使用上半年XPath:

xdoc.XPathSelectElements(@"//section[@name=""SectionA""]/control[@id=""Textbox1""]") 
    .Select(f => new 
        { Id = f.Attribute("id").Value, 
        Type = f.Attribute("type").Value, 
        Value = f.Element("value").Value }); 
+0

謝謝你的幫助。 – Mike 2012-04-27 15:54:29