2014-10-15 2 views
1

XML 파일을 쿼리하려고하지만 일부 노드는 네임 스페이스가 있으므로 다른 솔루션으로는 완벽한 솔루션을 얻을 수 없습니다.Linq 비표준 네임 스페이스를 사용하여 XML 쿼리

Xpath없이이 작업을 수행 할 수 있는지 궁금합니다. CB 일부 요소가 아닌 다른 사람에 존재 :

<Household name="Home" xmlns="AP:CB" description="Home" > 
    <InsuranceClaims/> 
    <mortgages> 
     <mortgage id="Sally Mae" xmlns="AP:CB" /> 
    </mortgages> 
    <Appliances> 
     <Appliance key="Stove" value="5000" /> 
    </Appliances> 
    <Persons> 
     <Person name="Henry" age="35" /> 
     <Person name="Jill" age="23" xmlns="AP:CB"/> 
    </Persons> 
</Household> 

XML 그래서 우리는 AP의 네임 스페이스를 가지고있다.

현재 시도하지 않은 결과가 없습니다.

_Household = _XDoc.Descendants() 
        .Where(x => x.Name == "Persons") 
        .Select(x => new 
         { 
          name = (string)x.Element("Person").Attribute("name").Value, 
          age = (string)x.Element("Person").Attribute("age").Value 
         }) 
       .ToDictionary(x => x.age, x => x.name); 

나는 일반적인 아이디어가 있다고 생각합니다.

편집 : 대/소문자 구분, 대소 문자 일치를 위해 captialization이 업데이트되었습니다. 하위 절 대괄호에 값을 추가하고 where 절을 변경하지 못했습니다.

+0

이 대소 문자를 구분하므로 이름 = (문자열) x.Element ("인") (이름 = (문자열) x.Element해야한다 "사람"). 나이와 똑같아. 그게 유일한 문제인지는 확실치 않지만, 분명히 문제의 일부입니다. – HaukurHaf

+0

귀하의 요구 사항은 무엇입니까? 왜 그것이 당신을 위해 작동하지 않는 경우 게시물에 댓글을하지 않는 이유는 무엇입니까? – Vishal

답변

2

올바르게 식별 한대로 코드의 주요 문제점은 XML 네임 스페이스와 관련이 있습니다. 자식 노드는 부모로부터 xmlns 선언을 상속합니다. 즉, 문서의 모든 요소가 동일한 네임 스페이스에 있음을 의미합니다.

네임 스페이스와 문서를 XML로 LINQ를 사용하여, 당신은 명시 적으로 네임 스페이스를 지정해야하는 경우 : 모든 Persons 요소를 선택하기 때문에,

XNamespace ns = "AP:CB"; 

… 

_Household = _XDoc.Descendants() 
        .Where(x => x.Name == ns + "Persons") 
        .Select(x => new 
         { 
          name = (string)x.Element(ns + "Person").Attribute("name").Value, 
          age = (string)x.Element(ns + "Person").Attribute("age").Value 
         }) 
        .ToDictionary(x => x.age, x => x.name); 

이 코드는 (헨리) 단일 값을 반환하지만를, 각 노드에 대해 첫 번째 Person 하위 노드를 선택합니다.

대신,이 같은 쿼리를 작성합니다

_Household = _XDoc.Descendants(ns + "Persons") 
        .Elements(ns + "Person") 
        .ToDictionary(x => (int)x.Attribute("age"), x => (string)x.Attribute("name")); 
+0

나는 귀하의 게시물에서 새로운 것을 배웠습니다. 위대한 포스트 주셔서 감사합니다. – Vishal

+0

정말 고마워요. 내 XML을 닦아야하는 것처럼 보입니다. – SCFi

관련 문제