Краткий LINQ to XML Query - PullRequest
       37

Краткий LINQ to XML Query

3 голосов
/ 21 апреля 2010

Предполагается, что у вас есть следующий XML:

<?xml version="1.0" encoding="utf-8"?>

<content>
    <info>
        <media>
            <image>
                <info>
                    <imageType>product</imageType>
                </info>
                <imagedata fileref="http://www.example.com/image1.jpg" />
            </image>
            <image>
                <info>
                    <imageType>manufacturer</imageType>
                </info>
                <imagedata fileref="http://www.example.com/image2.jpg" />
            </image>
        </media>
    </info>
</content>

Используя LINQ to XML, какой самый краткий и надежный способ получить System.Uri для изображения данного типа? На данный момент у меня есть это:

private static Uri GetImageUri(XElement xml, string imageType)
{
    return (from imageTypeElement in xml.Descendants("imageType")
            where imageTypeElement.Value == imageType && imageTypeElement.Parent != null && imageTypeElement.Parent.Parent != null
            from imageDataElement in imageTypeElement.Parent.Parent.Descendants("imagedata")
            let fileRefAttribute = imageDataElement.Attribute("fileref")
            where fileRefAttribute != null && !string.IsNullOrEmpty(fileRefAttribute.Value)
            select new Uri(fileRefAttribute.Value)).FirstOrDefault();
}

Это работает, но кажется слишком сложным. Особенно, если учесть эквивалент XPath.

Кто-нибудь может указать лучший способ?

Ответы [ 3 ]

1 голос
/ 21 апреля 2010
return xml.XPathSelectElements(string.Format("//image[info/imageType='{0}']/imagedata/@fileref",imageType))
.Select(u=>new Uri(u.Value)).FirstOrDefault();
1 голос
/ 21 апреля 2010
var images = xml.Descentants("image");

return images.Where(i => i.Descendants("imageType")
                          .All(c => c.Value == imageType))
             .Select(i => i.Descendants("imagedata")
                           .Select(id => id.Attribute("fileref"))
                           .FirstOrDefault())
             .FirstOrDefault();

Да пошли:)

0 голосов
/ 13 мая 2010

Если вы можете гарантировать, что файл всегда будет иметь соответствующие данные, тогда без проверки типа:

private static Uri GetImageUri(XElement xml, string imageType)
{
    return (from i in xml.Descendants("image")
            where i.Descendants("imageType").First().Value == imageType
            select new Uri(i.Descendants("imagedata").Attribute("fileref").Value)).FirstOrDefault();
}

Если null проверка является приоритетом (и кажется, что это так):

private static Uri GetSafeImageUri(XElement xml, string imageType)
{
    return (from i in xml.Descendants("imagedata")
            let type = i.Parent.Descendants("imageType").FirstOrDefault()
            where type != null && type.Value == imageType
            let attr = i.Attribute("fileref")
            select new Uri(attr.Value)).FirstOrDefault();
}

Не уверен, что с проверкой null вы получите гораздо более краткую информацию, чем

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