2013-10-04 5 views
3

LINQ를 사용하여 XML 파일을 읽는 데 문제가 있습니다. 여기 LINQ로 XML 노드 읽기

은 내가 사용하고 코드는

XElement doc = XElement.Load("xmldoc.xml"); 
    var query = from x in doc.Elements("Employee") where x.Element("Name").Attribute("Type").Value == "First" select x; 
    foreach (XElement item in query) 
    { 
     Console.WriteLine(item.Element("Name").Value); 
    } 

이 코드는 모든 첫번째 이름 저를 반환하지만 내가 처음부터 속성 값을 변경할 때 빈 오는 마지막

<?xml version="1.0" encoding="utf-8"?> 
<Employees> 
    <Employee> 
    <Name Type="First">Jack</Name> 
    <Name Type="Last">Black</Name> 
    </Employee> 
    <Employee> 
    <Name Type="First">John</Name> 
    <Name Type="Last">Blue</Name> 
    </Employee> 
    <Employee> 
    <Name Type="First">Dan</Name> 
    <Name Type="Last">Red</Name> 
    </Employee> 
    <Employee> 
    <Name Type="First">Patrick</Name> 
    <Name Type="Last">Green</Name> 
    </Employee> 
</Employees> 

다음 내 XML 파일입니다 .

내가 이름 노드를 전환하면 성을 다시 찾습니다. 내게는 각 employe 쿼리가 이름 노드에서 값을 반환하고 두 번째 노드에서는 값을 무시하는 것처럼 보입니다. 이 문제를 해결하도록 도와 주시겠습니까?

+0

당신이 정말'Employee' 쿼리 결과의 요소, 아니면 그냥 이름을 원하십니까? 이름 만 원한다면 직원이 아닌 이름을 선택해야합니다. 그렇지 않으면 원하지 않는 태그를 걸러 내기 위해 결과 (예 : XPath)를 변환해야합니다. 또는 단순히'where'를 생략하고'foreach'에서 원하는 태그를 붙잡 으면됩니다 : Console.WriteLine (item.Elements ("Name").) Single (i => i.Attribute ("Type") .Value == "Last"). Value); ' – mellamokb

답변

5

문제는 x.Element("Name") 호출이 첫 번째 Name 요소를 반환한다는 것입니다. 실제로 모든 Name 요소를 쿼리하고 Last 특성 값이있는 요소를 필터링해야합니다.

대신이 시도 :

var query = from x in doc.Elements("Employee").Elements("Name") 
      where x.Attribute("Type").Value == "Last" 
      select x; 

foreach (XElement item in query) 
{ 
    Console.WriteLine(item.Value); 
} 
+0

매력처럼 작동하지만 작은 문제가 1 개 있습니다. XDocument를 사용하여 XElement 대신 XML 파일을 열 경우에만 코드가 작동합니다. – user2847238

+0

@ user2847238 바로'XDocument'를 사용하여'Root' 속성을 추가했습니다. 나는 당신이 XElement를 사용하고있어서 그것이 필요 없다는 것을 깨달았다. 나는 포스트를 업데이트했고 이제는 괜찮을 것이다. –