2013-11-28 54 views
1

父母的屬性我有這樣一個XML文件:查看在後代

<reservation> 
    <day name="monday"> 
    <slot number="1"> 
     <name>..</name> 
     <description>..</description> 
    </slot> 
    <slot number="3"> 
     <name>..</name> 
     <description>..</description> 
    </slot> 
    </day> 
    <day name="friday"> 
    <slot number="4"> 
     <name>..</name> 
     <description>..</description> 
    </slot> 
    </day> 
</reservation> 

,我需要寫一個LINQ查詢,我將有機會獲得一天的nameslot屬性和元素於一體時間。

這將如何完成?

回答

1

也許它可以以更好的方式來完成,但是:

string xml = @"<reservation> 
    <day name=""monday""> 
     <slot number=""1""> 
      <name>name</name> 
      <description>desc</description> 
     </slot> 
     <slot number=""3""> 
      <name>..</name> 
      <description>..</description> 
     </slot> 
    </day> 
    <day name=""friday""> 
     <slot number=""4""> 
      <name>..</name> 
      <description>..</description> 
     </slot> 
    </day> 
    </reservation>"; 

var element = XElement.Parse(xml); 

var res = from day in element.Elements("day") 
      from slot in day.Elements() 
      from slotName in slot.Elements("name") 
      from slotDesc in slot.Elements("description") 
      select new 
      { 
      Day = day.Attribute("name").Value, 
      Slot = slot.Attribute("number").Value, 
      Name = slotName.Value, 
      Desc = slotDesc.Value 
      }; 

會產生這樣的結果:

Day Slot Name Desc 
monday 1 name desc 
monday 3 .. .. 
friday 4 .. .. 
+0

它看起來非常好,但它什麼都沒有返回,res變量是空的..? – Emetrop

+0

我複製粘貼我的答案在控制檯應用程序,它的工作方式和預期的一樣。考慮返回類型是一個匿名類型的IEnumerable。 – Alberto

+0

這是我的錯,我使用XDocument來代替XElement進行分析。 – Emetrop

0
var xDocument = XDocument.Parse(/* ... */); 

var slots = 
    xDocument.Descendants("day") 
      .SelectMany(day => day.Elements("slot") 
            .Select(
            slot => new 
             { 
             DayName = day.Attribute("name").Value, 
             Name = slot.Element("name").Value, 
             Number = slot.Attribute("number").Value, 
             //... 
             })); 
+0

但是我沒有訪問到日節點的「名稱」屬性.. – Emetrop

+0

@Emetrop我無法閱讀,現在修復 – decPL

0

也許這樣的事情會適合你:

var slots = xelement.Descendants("slot") 
        .Select(e => new 
        { 
         Slot = e, Day = e.Parent 
        }).ToList(); 

您可以進一步修改,只得到有趣的屬性或元素。

0

XObject類有a Parent property,所以換一個插槽s你可以這樣做:

s.Parent.Attribute("name").Value 

雖然這是一個有點難以閱讀 - 我們如何知道s.Parent是一個插槽?你可以只訪問你需要在day級別的所有信息:

var days = xDocument.Descendants("day"); 
var allSlots = days.SelectMany(d => { 
    // Your code here... 
    var daySlots = d.Descendants("slot"); 
    return daySlots.Select(s => String.Format("{0} {1}", 
           d.Attribute("name").Value, 
           s.Attribute("number").Value)); 
}); 
0
var document = XDocument.Load(xml); 

var query = from stol in document.Descendants("slot") 
      select new 
       { 
        Day = (string) stol.Ancestors().First().Attribute("name"), 
        Number = (int) stol.Attribute("number"), 
        Name = (string) stol.Descendants("name").SingleOrDefault(), 
        Description = (string) stol.Descendants("description").SingleOrDefault(), 
       };