2014-01-12 2 views
0

대단한 좌절감으로 XML 문서에 대한 쿼리를 작성하는 데 하루 반이 걸렸습니다. 시작하기 전에 내가 아는 것보다 더 많은 것을 모릅니다. 그래서 나는 쉬운 길을 택하고 도움을 다시 요청할 것입니다.XML 쿼리 - 값 검색

XML 코드는 다음과 같이이다 : 쿼리 예를 들어 값이 "AlphaId2_DeltaTypeA"를 검색하는 내가 찾고

<?xml version="1.0" ?> 
<Main> 
<alpha Id = "AlphaId_1"> 
    <beta>AlphaId1_Beta</beta> 
    <gamma>AlphaId1_Gama</gamma> 
    <delta Type = "A">AlphaId1_DeltaTypeA</delta> 
    <delta Type = "B">AlphaId1_DeltaTypeB</delta> 
    <kapa Id="01"> 
     <description>AlphaId1_KapaId1_Descr</description> 
     <name>AlphaId1KapaId1_Name</name> 
     <teta>AlphaId1KapaId1_Teta</teta> 
    </kapa> 
    <kapa Id="02"> 
     <description>AlphaId1KapaId2_Descr</description> 
     <name>AlphaId1KapaId2_Name</name> 
     <teta>AlhaId1KapaId2_Teta</teta> 
    </kapa> 
</alpha> 
<alpha Id = "AlphaId_2"> 
    <beta>AlphaId2_Beta</beta> 
    <gamma>AlphaId2_Gama</gamma> 
    <delta Type = "A">AlphaId2_DeltaTypeA</delta> 
    <delta Type = "B">AlphaId2_DeltaTypeB</delta> 
    <kapa Id="01"> 
     <description>AlphaId2_KapaId1_Descr</description> 
     <name>AlphaId2KapaId2_Name</name> 
     <teta>AlphaId2KapaId2_Teta</teta> 
    </kapa> 
    <kapa Id="02"> 
     <description>AlphaId1KapaId2_Descr</description> 
     <name>AlphaId2KapaId2_Name</name> 
     <teta>AlhaId2KapaId2_Teta</teta> 
    </kapa> 
</alpha> 
</Main> 

. 두 번째 쿼리는 선택한 AlphaId의 모든 KapaId에서 모든 설명 값을 검색해야합니다. 내가 가지고 올 수

유일한 코드는

XDocument xdoc = XDocument.Load(@"doc.xml"); 

IEnumerable<XElement> list1 = xdoc.Root.Descendants("delta"); 

    var cifmi = 
    from el in list1 
    where (string)el.Attribute("Type") == "A" 
    select el; 

    foreach (XElement el in cifmi) 
    { 
     textBox1.AppendText(el.Value + System.Environment.NewLine); 
    } 

입니다 코드는 하나가 아닌 두 개의 값을 찾습니다.

답변

1
var xDoc = XDocument.Load("Input.txt"); 

var alpha = (from a in xDoc.Root.Elements("alpha") 
      let deltas = a.Elements("delta") 
      let deltaA = deltas.First(x => (string)x.Attribute("Type") == "A") 
      where (string)deltaA == "AlphaId2_DeltaTypeA" 
      select a).First(); 

var descriptions = alpha.Elements("kapa") 
         .Select(x => (string)x.Element("description")).ToList(); 

그것은 단지 모두 Type="A"AlphaId2_DeltaTypeA의 값을 가지고 <delta> 찾습니다. 당신은 단지 값에 대해 관심이 있다면 한 것을 시도 :

* 알파 아이디 == "AlphaId_1"델타 유형 = "A"와 대답은 AlphaId1_DeltaTypeA이

var alpha = (from a in xDoc.Root.Elements("alpha") 
      let deltas = a.Elements("delta") 
      where deltas.Any(x => (string)x == "AlphaId2_DeltaTypeA") 
      select a).First(); 

업데이트 *

var alpha = (string)xDoc.Root 
         .Elements("alpha") 
         .First(x => (string)x.Attribute("Id") == "AlphaId_1") 
         .Elements("delta") 
         .First(x => (string)x.Attribute("Type") == "A"); 
+0

안녕하세요 Marcin. 알파 Id == "AlphaId_1"및 델타 Type = "A"조건을 만족하는 값을 찾을 수 있도록 쿼리를 작성하십시오. 대답은 AlphaId1_DeltaTypeA입니까? –

+0

첫 번째 샘플의'description'은'List '이므로 이미 값을 포함하고 있습니다. – MarcinJuraszek

+0

Marcin 대단히 감사합니다. 답변을 확인하는 데 오랜 시간이 걸려서 죄송합니다. 코드 작업이 조금 느립니다. 모두 완벽합니다. –