2011-09-15 4 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> 

예를 들어,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, 
      }; 

그러나 적절한 출력을 얻을하지 않습니다 입력은

나는이 코드를 시도 (XML에 단일 LINQ를 사용) & "G1skill1sub1"

예상 출력 "G1" = G1Skill1이다.

+1

XPath는 친구입니다. ['XPathSelectElements'] (http://msdn.microsoft.com/en-us/library/bb342176.aspx) 및 친구들을 참조하십시오. –

+0

@pst : 개인적으로 LINQ to XML 쿼리 표현식을 직접 사용하는 편이 낫습니다. 코드를 결합하면 결국 XPath가 신경질을 느낍니다 ("자손 찾기, 평등 비교"등 및 데이터 "G1", "G1skill1sub1"등). 모든 문자열 만 있다는 사실은 컴파일 타임 지원이 없음을 의미합니다. 실행시에만 표시되는 구문 오류로 끝나는 것이 더 쉽습니다. –

+0

@ 존 스키켓 유닛 테스트 ;-) 나는 실수로 더 많은 기회를 이끌 수있는 방법을 볼 수 있지만 사용하기 전에 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"); 
사용자의 입력에 의해 일어나고

예상 출력 :

  • 을 일치하는 모든 그룹에게
  • 을 찾아 각각의 일치를 위해 해당 그룹 내에서
  • 을 일치하는 모든 하위 기술을 찾기 잠수함, 부모 이름 찾기 (기술)
+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);