Советы, как лучше структурировать / отформатировать запрос LINQ to XML? - PullRequest
5 голосов
/ 21 ноября 2008

Я написал запрос LINQ to XML, который делает то, что я хочу, но выглядит довольно некрасиво. Мне интересно, как бы вы, ребята, отформатировали следующий запрос так, чтобы это выглядело не так броско?

Извинения, если мой пример немного многословен.

XML-документы, которые я запрашиваю, имеют следующую структуру:

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

И соответствующий запрос LINQ:

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

Спасибо!

1 Ответ

4 голосов
/ 21 ноября 2008

Основным «некрасивым» является материал внизу. Я бы, вероятно, добавил метод расширения (или просто служебный метод) - что-то вроде:

    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");

(снят)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...