2016-12-21 10 views
2

XML 문서를 쿼리하고 METEDATA 태그 내부의 COUNT 태그에 저장된 카운트를 반환하려고합니다. 문제는 프로그램에서 사용하기 위해 속성 strCount에 액세스하는 데 어려움이 있습니다. Ive는 IEnumerable을 통해 루핑을 고려했지만 더 깨끗한 방식으로 값을 액세스 할 수 있기를 기대했습니다. countQ [ "strCount"]와 같이 countQ.strCount를 반환합니다. 나는이 인스턴스에서 작동하지 않는다고 생각하지만 인덱스 나 루프와는 반대로 값을 원한 속성의 이름을 사용하려는 욕구를 설명하고자했습니다.IEnumerable 내부의 특정 속성에 액세스

CODE

Private XDocument doc = XDocument.Load(path);  

public class entityCount 
{ 
    public string strCount { get; set; } 
} 


public IEnumerable<entityCount> queryCount(){ 
     var countQ = this.doc.Descendants("METADATA") .Select(m => new entityCount { 
      strCount = m.Element("COUNT").Value 
     }); 

     return countQ.....?;  
} 

단축 XML

<PRODUCTION_SET> 
    <METADATA> 
     <COUNT>322</COUNT> 
    </METADATA> 
    <ENTITY> 
     <METADATA> 
      <ID>1</ID> 
      <foo>x</foo> 
      <bar>y</bar> 
     </METADATA> 
    </ENTITY> 
    . 
    . 
    . 
    . 
    . 
    <ENTITY> 
     <METADATA> 
      <ID>322</ID> 
      <foo>x</foo> 
      <bar>y</bar> 
     </METADATA> 
    </ENTITY> 
</PRODUCTION_SET> 

답변

3

첫 번째 메타 태그의 수를 얻으려면, 당신은이 작업을 수행 할 수 있습니다 : countQ.First()

만약 당신이 관심 는 PRODUCTION_SET의 메타 데이터 태그 일 뿐이므로 Descendants를 사용하지 않아야합니다 (개별 엔터티에서도 상황을 무시하고 더 깊게 찾고자 함). 대신 PRODUCTION_SET 태그를 찾은 다음 .Elements().Select(...).Single()을 수행하십시오. Single()은 First()와 거의 같지만 찾고있는 요소가 하나만 있는지 확인합니다. 이 경우, 코드는 다음과 같습니다

public entityCount queryCount(){ 
    return this.doc.Root.Elements("METADATA").Select(m => new entityCount { 
     strCount = m.Element("COUNT").Value 
    }).Single(); 
} 
+0

이것은 형식 오류를 반환합니다. "Implicity can not Implicity; namespace.enitiyCount to System.Collection.Generic.IEnumerabl 캐스트가 없습니다. – LCaraway

+0

죄송합니다. IEnumerable 대신 entityCount를 반환하도록 변경했습니다. 다시 찾고 싶습니까? 그러면 다음과 같이 사용할 수 있습니다 :'queryCount(). strCount' – Neme

+0

오, 방금 그걸 보았습니다!이게 얼마나 깨끗한 지요? – LCaraway

0

당신은 같은 First() 또는 FirstOrDefault()를 사용하여 IEnumerable<T>의 첫 번째 항목을 얻을 수 있습니다 :

var queryCountResult = countQ.FirstOrDefault(); 
if(queryCountResult !=null) 
{ 
    var count = queryCountResult.strCount; 
} 
2

당신은 목록에 IEnumerable에서 <T> 변환과 인덱스를 통해 요소에 액세스 할 수 있습니다

int cnt = countQ.ToList()[0].strCount; 
return cnt; 

질문을, 쿼리에 오직 하나 개의 항목을 반환하지입니까? 당신은 하나의 항목 만이 알고 있다면, 당신은 단지 First()를 사용할 수 있습니다

int cnt = countQ.First().strCount; 
return cnt; 
+0

우리는이 특정 예에서하지 인덱스는 IEnumerable 개체 –

+0

는 오직 하나 개의 항목이 될 것입니다 수 있습니다. 나는 여러개의 결과를 얻을 수있는 별도의 질의를 가질 것이다. – LCaraway

+0

@ EhsanSajjad - 아, 네 말이 맞아. 업데이트 됨. –