2009-10-28 4 views
8

나는 IEnumerable 컬렉션을 가지고 있으며 각 속성 값은 비즈니스 개체의 다른 속성에 해당합니다. 저는 여기에 대해 질의하고있는 XML의 샘플입니다속성 값으로 XElement 찾기

<SimpleData name="zip">60004</SimpleData> 
    <SimpleData name="name">ARLINGTON HEIGHTS</SimpleData> 
    <SimpleData name="state">IL</SimpleData> 
    <SimpleData name="countyname">COOK</SimpleData> 
    <SimpleData name="lat">42.1121336684356</SimpleData> 
    <SimpleData name="lon">-87.9736682731814</SimpleData> 

내가 내 linq2xml 람다 가까운 생각이 (SO MSDN을 검색하고 후) 그러나 나는 바로 그것을 조정할 수없는 것 :

string cityName = simpleData.Where(a => a.Attribute("name").Value == "name").Select(a => a.Value).ToString(); 

"System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [System.Xml.Linq.XElement, 선택 System.String]"대신 알링턴 하이츠

어떤 제안의 할당 CityName이 수의 값? 감사합니다

답변

16
string cityName = (simpleData.Where(a => a.Attribute("name").Value == "name") 
        .Select(a => a.Value)).FirstOrDefault(); 

또는 name 속성 name에 해당하는 모든 요소 값을 포함하는 (거의 항상 컬렉션 및 단일하지 인스턴스를 반환으로 LINQ 확장 메서드)를 IEnumerable<string>를 반환

(from x in simpleData 
where x.Attribute("name").Value == "name" 
select x.Value).FirstOrDefault() 

. 그런 다음 첫 번째 항목을 가져 오거나 null이 비어 있으면 가져옵니다.

또한 XML은 끔찍하며 촬영해야합니다.

+6

+1 그 XML을 촬영해야합니다! – CoderDennis

+5

'(string) Attribute ("name")'Attribute ("name")에 대해 사용하는 것이 좋습니다. Value - 처음에는 Null-check를한다는 점만 빼고는 똑같습니다. 이러한 속성을 가진 애트리뷰트가 엘리먼트에 존재하지 않을 때'Attribute()'는'null'를 리턴하기 때문에, 첫번째 엘리먼트는 현재 쓰여진 쿼리에서'NullReferenceException'을 트리거합니다. –

+0

젠장, 나는 그것이 내가 잃어버린 것이었다는 것을 알았다. FirstOrDefault가 그것을 추가했다. 감사. XML에 대해 할 수있는 일은 많지 않습니다. 제 3 자 데이터 가져 오기 소스입니다. –

3

당신은 XML이 경우 : XElement를 /하여 XDocument SimpleDataList에로드

<SimpleDataList> 
    <SimpleData name="zip">60004</SimpleData> 
    <SimpleData name="name">ARLINGTON HEIGHTS</SimpleData> 
    <SimpleData name="state">IL</SimpleData> 
    <SimpleData name="countyname">COOK</SimpleData> 
    <SimpleData name="lat">42.1121336684356</SimpleData> 
    <SimpleData name="lon">-87.9736682731814</SimpleData> 
</SimpleDataList> 

, 당신은 XPath를 함께 조회 할 수 있습니다

SimpleDataList.XPathSelectElement(@"//SimpleDataList/SimpleData[@Name=""name""]"); 

을하지만 당신은 XElement를에가 있는지 확실하지 않습니다 시작 또는 간단한 IEnumerable ... 어떤 경우에는 ... 나는 그것이 당신을 도와 줄 경우를 대비하여 XPath를 언급 할 것이라고 생각했다.

+1

XPath를 사용하여 'XDocument'를 쿼리하는 것은 LINQ에 맞게 조정되었으므로별로 의미가 없습니다. XPath는 약간 더 느려질 것입니다 (왜냐하면 먼저 파싱되어야하는 문자열이기 때문입니다). –