2011-12-20 3 views
1

나는 다음과 같은 XML 파일이 : 나는 고객의 위치에 따라 남성의 값을 얻기 위해 XML을 중위로 LINQ를 사용하여 쿼리하려고linq to xml을 사용하여 XML 파일을 쿼리 하시겠습니까?

<?xml version="1.0" encoding="utf-8"?> 
<Cus> 
    <Customer Location="NJ"> 
    <Male Value="True" /> 
    <Name Value="xxx" /> 
    </Customer> 
    <Customer Location="NY"> 
    <Male Value="True" /> 
    <Name Value="yyy" /> 
    </Customer> 
</Cus> 

합니다. 여기

쿼리입니다 : 나는 남성의 가치를 얻을 수 있어요

var Male = from e in doc.Descendants("Male") 
      select new 
      { 
       Male = e.Attribute("Value").Value.ToString() 
      }; 

하지만 난 추가하기 위해 XML file.How에서 고객의 위치에 따라 이름을 얻는 방법을 혼란 스러워요 여기에 고객의 위치를 ​​결정하는 조건이 있습니다. 어떤 사람이 나를 안내 할 수 있다면 감사 할 것입니다.

답변

0

XML에 사용자가 지정한 요소 나 속성이 포함되어 있지 않으면 null 값으로 실행하는 것에 대해 걱정할 필요없이 XML을 쿼리 할 수 ​​있습니다.

이 확장 메서드에 대한 코드는 여기에 있습니다 :

public static XElement SafeElement(this XContainer container, string name) 
    { 
     return container.Element(name) ?? new XElement(name); 
    } 

    public static XAttribute SafeAttribute(this XElement element, string name) 
    { 
     return element.Attribute(name) ?? new XAttribute(name, ""); 
    } 

당신은 다음과 같이 사용 :

 var customers = xdoc.Descendants("Customer") 
         .Where(x => x.SafeAttribute("Location").Value == "NJ") 
         .Select(x => x.SafeElement("Male").SafeAttribute("Value").Value); 

만약 위치 특성 또는 남성 요소는 결국 존재하지 않는 어떤 이유 예외 대신에 빈 결과 세트를 사용합니다.

0

남성을 구하기 전에 Customer 요소에서 where 절을 사용하려고합니다. 이 같은 뭔가 :

var males = from customer in doc.Descendants("Customer") 
      where "NY".Equals(customer.Attribute("Location").Value) 
      select customer.Descendants("Male"); 

참고 :이 테스트되지 않았지만, 그것은 당신에게 진행하는 방법에 대한 몇 가지 표시를 제공해야합니다. 자세한 내용은 where 키워드에서 MSDN article을 확인하십시오.

또한 도움이된다면 열거 형 컬렉션에는 LINQ Extensions을 사용하는 것이 좋습니다. 나는 그들이 절 키워드보다 훨씬 읽고 쓰는 것이 더 쉽다고 생각한다. 난 정말 XML 확장 방법 SafeElement 및 SafeAttribute들이하자로처럼 같은 것을 들어

private string CountOfMales(XDocument doc, string locationToFilter) 
{ 
    var selection = from customer in doc.Descendants("Customer") 
       .Where(c => c.Attribute("Location").Value == locationToFilter) 
       select new 
       { 
        MaleValue = customer.Element("Name").Attribute("Value").Value 
       }; 

       return selection.FirstOrDefault().MaleValue; 
} 
0

: 당신이 뭔가를 사용할 수있는 위치에 따라 이름의 값을 선택합니다 - 귀하의 질문에 당

관련 문제