2011-09-15 12 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(XMLへの単一LINQを使用して)

ある私は、このコードを試してみました:

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)とお友達を参照してください。 –

+0

@pst:個人的には、LINQ to XMLのクエリ式を直接使用する方が好きです。コードを組み合わせると、XPathは神経質になります(「子孫を見つけ、同等性を比較する」など、データ「G1」、「G1skill1sub1」など)。それが単なる文字列であるということは、コンパイル時のサポートもないことを意味します。実行時にのみ表示される構文エラーで終わるほうが簡単です。 –

+0

@Jon Skeet Unit tests ;-)私はそれがどのようにして間違いの可能性につながるかを見ることができますが、使用前にnullの属性をチェックしたり、名前を間違って取得するのを忘れて、それは、より強く型付けされたLINQプロバイダとは少し異なります。 –

答えて

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"); 

  • 一致するすべてのグループ
  • は、各マッチングのために、これらのグループ
  • 内のすべての一致するsubskillsを探しますサブスキル、親の名前を見つける(スキル)
+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: 'skill'を繰り返します。' 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); 
関連する問題