2017-12-26 29 views
1

특정 특성을 가진 요소가 있는지 여부를 확인하기 위해 구문 분석하는 XML 문서가 있습니다.XML에서 Linq 요소로 특성 별 선택시 개체 참조 오류 가져 오기

을 :

내가

item.Descendants().Elements("nameValue"); 

작업을 수행 할 때의 나는이처럼 보이는 nameValue 노드 있다고 가정 해 봅시다 나는 결과의 무리를 볼 수 있습니다 내가 드릴 다운 할 때 난 속성을

를 볼 수 있습니다

<nameValue idref="myIDRef" name="elementName"/> 

이 요소를 idref로 찾는 두 가지 방법을 시도했으며 두 객체 반환 오류를 반환했습니다. 나는 이것이 매우 간단 확신하지만 난 정말

item.Descendants().Select(a => a.Element("nameValue")).Where(b => b.Attribute("idref").Value == "myIDRef"); 
item.Descendants().Elements("nameValue").Single(a => a.Attribute("idref").Value == "myIDRef"); 

위 작품의 어느

편집 붙어있어 너무 오랫동안이 쳐다 봤는데 : 내가 알아 낸 것 같아요 왜 작동하는지. 내 nameValue 요소 모음에는 수백 가지 항목이 있지만 모든 속성에 "idref"특성이있는 것은 아닙니다. 특정 특성이 컬렉션에 있었더라도 내 개체 참조 오류가 발생하는 이유는 무엇입니까?

이 내 솔루션은 사용할 수 Linq를 사용하고 XPathSelectElements 대신

var nameValueArr = element.XPathSelectElements("descendant::nameValue[@idref='myIDRef']"); 
+0

두 번째 요소에는 어떤 문제가 있습니까? 그것은 나를 위해 작동 – Magnetron

+0

나는 두려워하고, 나는 철자와 모든 것을 확인 트리플. 그것은 단지 작동하지 않습니다. 이것으로 작업이 끝났습니다. var nameValueTest = element.XPathSelectElement ("descendant :: nameValue [@ idref = 'myIDRef']"); – JOO

+0

값을 사용하면 찾을 수없는 경우를 제외하고는 값이 사용됩니다. (문자열) b.Attribute ("idref") – jdweng

답변

0

를 사용하지 않도록했다

var el = item.Descendants("nameValue") 
    .FirstOrDefault(x=>x.Attribute("idref")?.Value=="myIDRef"); 
두 개 이상의 요소가있는 경우 싱글 FirstOrDefault 반환하면서 오류를 반환합니다

최초의 요소. 요소가없는 경우는 null

편집을 읽은 후 위 코드에서와 같이 Value 앞에 null condicional 연산자 (?.)를 사용할 수 있습니다. "idref"속성이 없으면 null을 반환하고 그렇지 않으면 Value을 평가합니다. , 속성이없는 경우

var result= item.Descendants("nameValue") 
       .Where(e=>(string)e.Attribute("idref")=="myIDRef"); 

주조가 null를 반환합니다, 그래서 당신은 오류의 저장 위치 :

1

내가 지금 당신의 업데이 트를보고, 당신은 아직도 당신이 기대하는 결과를 얻기 위해 LINQ to XML을 사용할 수 있습니다 요소에 특성이없는 경우 null"myIDRef"을 비교할 것이므로

+0

감사합니다! 많은 의미가 있습니다. 문자열로 변환 할 생각이 전혀 없었습니다. – JOO