简洁的 LINQ to XML 查询

发布于 2024-08-29 17:03:22 字数 1500 浏览 2 评论 0原文

假设您有以下 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 等价物时。

有人能指出更好的方法吗?

Assuming you have the following 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>

Using LINQ to XML, what is the most succinct, robust way to obtain a System.Uri for an image of a given type? At the moment I have this:

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

This works, but feels way too complicated. Especially when you consider the XPath equivalent.

Can anyone point out a better way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

笑红尘 2024-09-05 17:03:22
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();

尝试一下:)

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

Give that a go :)

幻想少年梦 2024-09-05 17:03:22
return xml.XPathSelectElements(string.Format("//image[info/imageType='{0}']/imagedata/@fileref",imageType))
.Select(u=>new Uri(u.Value)).FirstOrDefault();
return xml.XPathSelectElements(string.Format("//image[info/imageType='{0}']/imagedata/@fileref",imageType))
.Select(u=>new Uri(u.Value)).FirstOrDefault();
缘字诀 2024-09-05 17:03:22

如果您可以保证文件始终具有相关数据,则无需进行类型检查:

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 检查相比。

If you can guarantee the file will always have the relevant data, then with no type checking:

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

If null checking is a priority (and it seems it is):

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

Not sure if you'll get much more succinct than that with null checking.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文