2008-11-21 9 views
5

Ben istediğimi yapan bir LINQ XML sorgusu yazdım, ama oldukça çirkin görünüyor. Merak ediyorum, şu sorguyu nasıl bu kadar garip görünmeyecek şekilde biçimlendirirsiniz?XML sorgusuna bir LINQ yapılandırmak/biçimlendirmek için en iyi yol hakkında öneri?

Örneğim biraz ayrıntılı ise özür dilerim.

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

Ve LINQ sorgusu tekabül: Aşağıdaki yapıya sahip sorgulama ediyorum

XML belgeleri

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() 
      }; 

teşekkürler!

+0

ne yapar .DefaultIfEmpty() tamamlandı mı? –

cevap

4

Ana "çirkin" altta bulunan şeyler var. Muhtemelen bir uzantısı yöntemi (ya da sadece bir yarar yöntemi) eklersiniz - şey gibi: gibi bir şey kullanmak gerekir sonra

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

:

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

(kontrolsüz)

İlgili konular