2008-11-21 38 views
5

Tôi đã viết một truy vấn LINQ to XML để thực hiện những gì tôi muốn, nhưng có vẻ khá xấu xí. Tôi tự hỏi, làm thế nào bạn sẽ định dạng các truy vấn sau đây trong một cách mà không nhìn khá ảm đạm?Tư vấn về cách tốt nhất để cấu trúc/định dạng truy vấn LINQ to XML?

Xin lỗi nếu ví dụ của tôi hơi dài dòng.

Các tài liệu XML Tôi truy vấn có cấu trúc sau:

<?xml version="1.0" encoding="iso-8859-1"?> 
<newsitem itemid="1" id="root" date="1996-08-20" xml:lang="en"> 
    <title>A title</title> 
    <headline>A headline</headline> 
    <dateline>A dateline</dateline> 
    <text> 
     Some text 
    </text> 
    <metadata> 
     <codes class=""> 
      <code code=""> 
       <editdetail attribution=""/> 
      </code> 
     </codes> 
     <dc element="dc.date.created" value=""/> 
     <dc element="dc.publisher" value=""/> 
     <dc element="dc.date.published" value=""/> 
     <dc element="dc.source" value=""/> 
     <dc element="dc.creator.location" value=""/> 
     <dc element="dc.creator.location.country.name" value=""/> 
     <dc element="dc.source" value=""/> 
    </metadata> 
</newsitem> 

Và tương ứng với LINQ truy vấn:

XElement dummy = new XElement("dummy"); 
var query = from article in newsdoc.Elements("newsitem").DefaultIfEmpty(dummy) 
      select new 
      { 
       NewsItemID = (int)article.Attribute("itemid"), 
       Date = (DateTime)article.Attribute("date"), 
       Title = (string)article.Element("title"), 
       Headline = (string)article.Element("headline"), 
       ByLine = (string)article.Element("byline"), 
       DateLine = (string)article.Element("dateline"), 
       NewsText = (string)article.Element("text"), 
       Publisher = (string)article.Elements("metadata").Elements("dc").Where(x => (string)x.Attribute("element") == "dc.publisher").Attributes("value").DefaultIfEmpty().ElementAt(0), 
       DatePublished = (DateTime)article.Elements("metadata").Elements("dc").Where(x => (string)x.Attribute("element") == "dc.date.published").Attributes("value").DefaultIfEmpty().ElementAt(0), 
       Source = (string)article.Elements("metadata").Elements("dc").Where(x => (string)x.Attribute("element") == "dc.source").Attributes("value").DefaultIfEmpty().ElementAt(0), 
       CreatorLocation = (string)article.Elements("metadata").Elements("dc").Where(x => (string)x.Attribute("element") == "dc.creator.location").Attributes("value").DefaultIfEmpty().ElementAt(0), 
       CreatorLocationCountryName = (string)article.Elements("metadata").Elements("dc").Where(x => (string)x.Attribute("element") == "dc.creator.location.country.name").Attributes("value").DefaultIfEmpty().ElementAt(0), 
       Codes = article.Elements("metadata").Elements("codes").Elements("code").Attributes("code").DefaultIfEmpty() 
      }; 

Cảm ơn!

+0

gì .DefaultIfEmpty() hoàn thành? –

Trả lời

4

Chính "xấu xí" có nội dung ở dưới cùng. Tôi có lẽ sẽ thêm một phương pháp mở rộng (hay chỉ là một phương pháp hữu ích) - một cái gì đó như:

public static XAttribute GetMetadata(this XElement parent, string key) 
    { 
     return parent.Elements("metadata").Elements("dc") 
       .FirstOrDefault(x => x.Attribute("element").Value == key) 
       .Attribute("value"); 
    } 

sau đó bạn sẽ có thể sử dụng một cái gì đó như:

Publisher = (string)article.GetMetadata("dc.publisher"); 

(đánh dấu)

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