如何最佳地组织/格式化LINQ to XML查询?

5

我编写了一个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()
            }; 

谢谢!


.DefaultIfEmpty() 的作用是什么? - Frank Schwieterman
1个回答

4
主要的“丑陋”在于底部的内容。我可能会添加一个扩展方法(或者只是一个实用程序方法)-类似于:
    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");

(未选中)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接