2012-02-13 5 views
4

다른 도전 과제가 있습니다. 나는 여기서 찾은 몇 가지 질문을 훑어 보았지만, 내가 필요한 것을 하나로 모으는 것처럼 보일 수는 없다.속성을 기반으로하는 Linq 쿼리

<Output id="1"> 
    <path rename="Off" name="pattern-1">d:\temp</path> 
    </Output> 

    <Output id="2"> 
     <path isRename="False" name="pattern-1" >d:\temp\out2</path> 
     <path isRename="True" name="pattern-1" >d:\temp\out3</path> 
     <path isRename="False" name="pattern-1">d:\temp\out4</path> 
    </Output> 

내가해야 할 것은 id 속성에 따라 <Output> 태그를 찾을 수 있습니다 :

OK I는 XML 파일이 있습니다. 그런 다음 모든 <path> 태그를 반복하고 속성 및 경로 값을 가져와야합니다. 나는 물어 봤다 이전의 질문에 따라 몇 가지 일을 시도하지만 난 당신이 실제로 결과를 사용하지 않는 경우

var results = from c in rootElement.Elements("Output") 
       where (string)c.Attribute("Id") == "2" select c; 

foreach (var path in rootElement.Elements("Output").Elements("path")) 
{ 
    string p = path.Value; 
} 

답변

1

는 첫 번째 라인은 아무것도하지 않는 일을 가져올 수 없습니다. 당신의 id 속성이 고유합니다 경우

foreach (var outputElement in rootElement.Elements("Output") 
             .Where(e => (string)e.Attribute("id") == "1")) 
{ 
    foreach (var pathElement in outputElement.Elements("path")) 
    { 
     // ... 
    } 
} 

(이 그것을해야한다), 첫 번째 foreach는 제거하고 단지 직접 개별 <Output>를 얻을받을 수 있습니다

var outputElement = rootElement.Elements("Output") 
           .FirstOrDefault(e => (string)e.Attribute("id") == "1")); 
+0

고마워요! 이제 내 실수를 저질렀습니다. – Mike

0

나는 몇 가지를 사용하는 것이 좋습니다를 XPath를 사용하여 필요한 노드를 선택하십시오.

foreach (XElement path in root.XPathSelectElements("/Output/path[../@id=1]")) 
{ 
    string value = path.Value; 
} 

사실 XPath는 가독성이 높고 유지 보수가 쉬운 코드를 작성할 수 있습니다. 여러 linq-to-xml 문을 대체하는 표현식을 사용하기 만하면됩니다.