2009-10-28 46 views
8

Tôi có một bộ sưu tập các IEnumerables và mỗi bộ có một giá trị thuộc tính khác nhau tương ứng với một thuộc tính khác nhau trên đối tượng kinh doanh của tôi. Đây là một mẫu của XML mà tôi đang truy vấn chống lại:Tìm XElement theo giá trị thuộc tính

<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> 

Tôi nghĩ lambda linq2xml tôi gần (sau khi tìm kiếm MSDN và SO) nhưng tôi dường như không thể tinh chỉnh nó vừa phải:

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

giá trị có được của cityName giao cho "System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [System.Xml.Linq.XElement, System.String]" thay vì Arlington Heights

Bất kỳ lời đề nghị? Cảm ơn

Trả lời

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

hoặc

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

mà trả về một IEnumerable<string> (phương pháp khuyến nông LINQ hầu như luôn luôn trở về bộ sưu tập và các trường hợp không duy nhất) có chứa tất cả các giá trị phần tử có thuộc tính name bằng name. Sau đó, chúng tôi lấy cái đầu tiên, hoặc null nếu trống.

Ngoài ra, XML đó là khủng khiếp và phải được quay.

+6

+1 cho XML đó nên được quay! – CoderDennis

+5

Tôi sẽ đề nghị sử dụng thuộc tính '(string) (" name ")' over 'Attribute (" name "). Value' - nó giống nhau, ngoại trừ việc nó kiểm tra null trước. Vì 'Attribute()' trả về 'null' khi không có thuộc tính nào với các tên thoát như vậy trên một phần tử, phần tử đầu tiên như vậy sẽ kích hoạt một' NullReferenceException' trong truy vấn như hiện đang được viết. –

+0

Chết tiệt, tôi biết đó chỉ là một điều nhỏ mà tôi đã bỏ lỡ, thêm FirstOrDefault đã làm điều đó. Cảm ơn. Tôi không thể làm gì nhiều về XML, đó là nguồn nhập dữ liệu của bên thứ ba. –

3

Nếu bạn có XML:

<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> 

nạp trong XElement/XDocument SimpleDataList, bạn có thể truy vấn với XPath:

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

Nhưng tôi không chắc chắn nếu bạn có một XElement để bắt đầu với hoặc một IEnumerable đơn giản ... Trong mọi trường hợp .. tôi figured tôi sẽ đề cập đến XPath trong trường hợp nó giúp bạn.

+1

Không có ý nghĩa gì khi sử dụng XPath để truy vấn 'XDocument', vì nó được thiết kế riêng cho LINQ. XPath cũng sẽ chậm hơn một chút (vì đó là một chuỗi phải được phân tích trước). –

Các vấn đề liên quan