【问题标题】:Hi, How to parse xml with descendants within descendants C#嗨,如何用后代 C# 中的后代解析 xml
【发布时间】:2012-07-15 23:42:41
【问题描述】:

我正在尝试解析此 xml 并可以成功获取名称和描述,但将图像放在一起很棘手。两种单独的代码解析都有效,但我想做一个解析,以便将它们全部绑定到一个列表框。

xml 看起来像这样

<stickers>
    <sticker>
        <imageData>
            <baseImageUrl> ... want this  </baseImageUrl>
            <sizes>
                <size>  don't care about this </size>
            </size>
            <imageUrlSuffix> ..want this </imageUrlSuffix>
        </imageData>
        <description>.... want this </description>
        <name>  --want this </name>
    <sticker>
<stickers>

我的代码适用于两者,但分别适用。我如何将其组合成一个解析...

XDocument streamFeed = XDocument.Load(new StringReader(response.Content));
var imagedata = from query in streamFeed.Descendants("sticker").Elements("imageData")
    select new Stickers
    {
        image = (string)query.Element("baseImageUrl") + "huge" + (string)query.Element("imageUrlSuffix"),
    };


var data = from query in streamFeed.Descendants("sticker")
    select new Stickers
    {
        name = (string)query.Element("name"),
        description = (string)query.Element("description"),   
    };

stickersListBox.ItemsSource = imagedata.Union(data);

数据显示在列表框中,但标签在描述上方,而不是并排显示。

谢谢


感谢下面的 Thomas,以下代码有效,但一些用户配置文件得到了空引用异常(包括我自己的配置文件,显然有数据) 感谢 Thomas 的帮助也许这是一个不相关的错误?

XDocument streamFeed = XDocument.Load(new StringReader(response.Content));

                    var query =
                        from sticker in streamFeed.Root.Descendants("sticker")
                        let imageData = sticker.Element("imageData")
                        select new Stickers
                        {
                            name = (string)sticker.Element("name"),
                            description = (string)sticker.Element("description"),
                            image = (string)imageData.Element("baseImageUrl") + "huge" + (string)imageData.Element("imageUrlSuffix")
                        };

                    stickersListBox.ItemsSource = query;

【问题讨论】:

  • 听起来 Xml 被解析得很好。您是说所有数据都显示了,但不是您希望的显示方式?
  • @MichaelGraczyk 是的,它可以正确解析,但无法正确显示,因为数据是作为单独的对象而不是具有 (image+name+description) 的对象添加到列表中的图像之后的对象

标签: c# xml parsing linq-to-xml descendant


【解决方案1】:

如果我正确理解了这个问题,这应该可以满足您的要求:

XDocument streamFeed = XDocument.Load(new StringReader(response.Content));
var query =
    from sticker in streamFeed.Root.Elements("sticker")
    let imageData = sticker.Element("imageData")
    select new Stickers
    {
        name = (string)sticker.Element("name"),
        description = (string)sticker.Element("description"),   
        image = (string)imageData.Element("baseImageUrl") + "huge" + (string)imageData.Element("imageUrlSuffix")
    };

stickersListBox.ItemsSource = query;

【讨论】:

  • 感谢您的及时回复!该代码没有给出错误,但数据不显示(可能为空)。我对您的代码 streamFeed.Descendants("sticker") 而不是 root 做了一个小改动,它返回名称和描述的数据,但图像的 null 引用异常。
  • 您是否在问题中发布了完整的 XML?我使用 Elements 而不是 Descendants,因为它更有效,但它要求您知道文档的确切结构
  • 我编辑了我原来的帖子,代码可以工作,但有些错误可能无关......谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 1970-01-01
相关资源
最近更新 更多