2008-11-21 12 views
5

He escrito una consulta de LINQ a XML que hace lo que quiero, pero se ve bastante feo. Me pregunto, ¿cómo formatearán la siguiente consulta de una manera que no se vea tan llamativa?Asesoramiento sobre la mejor forma de estructurar/formatear una consulta LINQ a XML?

Disculpas si mi ejemplo es un poco detallado.

Los documentos XML que estoy consultando tiene la siguiente estructura:

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

Y consulta LINQ correspondientes:

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

Gracias!

+0

lo que hace el .DefaultIfEmpty() ¿lograr? –

Respuesta

4

El principal "feo" es el material en la parte inferior. Yo probablemente añadir un método de extensión (o simplemente un método de utilidad) - algo así como:

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

, entonces debería ser capaz de usar algo como:

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

(sin marcar)

Cuestiones relacionadas