2011-09-15 37 views
0
<?xml version="1.0" encoding="utf-8" ?> 
<MYROOT> 
    <Group name="G1"> 
     <Skill name="G1Skill1"> 
       <SubSkill>G1skill1sub1</SubSkill> 
       <SubSkill>G1skill1sub2</SubSkill> 
     </Skill > 
    <Skill name="G1Skill2"> 
       <SubSkill>G1skill2sub1</SubSkill> 
       <SubSkill>G1skill2sub2</SubSkill> 
     </Skill > 
    </Group> 
    <Group name="G2"> 
    <Skill name="G2Skill1"> 
       <SubSkill>G2skill1sub1</SubSkill> 
       <SubSkill>G2skill1sub2</SubSkill> 
    </Skill > 
    <Skill name="G2Skill2"> 
       <SubSkill>G2skill2sub1</SubSkill> 
       <SubSkill>G2skill2sub2</SubSkill> 
    </Skill > 
</Group> 
</MYROOT> 

例如, 輸入是"G1" & "G1skill1sub1"我需要使用LINQ to XML查詢來確定值嗎?

預計輸出= G1Skill1(使用單一的LINQ to XML)

我試過這段代碼:

var xmlDoc = XDocument.Load(Server.MapPath("XMLFile1.xml")); 
     var skills = 
     from skill in xmlDoc.Descendants("Group") 
     where skill.Attribute("name").Value.Equals("G1") // && skill.Element("SubSkill").Value.Equals("Group") 
     select new 
      { 
       Myskill = skill.Element("Skill").Value, 
       mytext= skill.Attribute("name").Value, 
      }; 

但沒有得到適當的輸出。

+1

XPath是你的朋友。參見['XPathSelectElements'](http://msdn.microsoft.com/en-us/library/bb342176.aspx)和朋友。 – 2011-09-15 07:14:40

+0

@pst:個人而言,我更喜歡直接使用LINQ到XML查詢表達式 - XPath讓我感到緊張,因爲您最終將代碼(「查找後代,比較相等」等和數據「G1」,「G1skill1sub1」等)結合起來。事實上,這只是一個字符串,也意味着沒有編譯時支持 - 最終只會出現語法錯誤,而這種錯誤只會在執行時顯示出來。 –

+0

@Jon Skeet單元測試;-)我可以看到它如何*可能導致更多的錯誤機會,但我已經足夠咬了,只是忘記檢查一個屬性爲空之前使用或名稱錯誤,所以..這與一個更強大的LINQ提供者有點不同。 – 2011-09-15 07:38:08

回答

2

我會用:

var skills = from group in doc.Descendants("Group") 
      where (string) group.Attribute("name") == "G1" 
      from subskill in group.Descendants("SubSkill") 
      where (string) subskill == "G1skill1sub1" 
      select (string) subskill.Parent.Attribute("name"); 

這就是你的投入會與預期輸出:

  • 找到所有匹配的組
  • 查找所有匹配的次技巧這些組中
  • 對於每個匹配(技能)
+0

嘿它給一些表達式像'System.Linq.Enumerable + WhereSelectEnumerableIterator'2 [<> f__AnonymousType0'2 [System.Xml.Linq.XElement,System.Xml .Linq.XElement],System.String]' 作爲一個輸出是的輸出值在那裏,當我做了'QuickWatch'它在那裏在結果視圖> [0]>'myoutput' 但我該如何打印? – Neo

+0

@ashuthinks:遍歷'技能' - 它實現'IEnumerable '。 –

+0

同樣的錯誤:(請詳細說明? – Neo

0

我試過這樣並且工作正常

  string input1 = "G1"; 
     string input2 = "G1skill1sub1"; 

     string output = 
      (from skill in xdoc.Descendants("Skill") 
      let subskill = skill.Element("SubSkill") 
      let g = skill.Parent 
      where g.Name == "Group" && g.Attribute("name").Value == input1 
      && subskill != null && subskill.Value == input2 
      select skill.Attribute("name").Value).FirstOrDefault(); 

     Console.WriteLine(output);