3

在将一些 XML 读入 Windows 8 商店应用程序时遇到问题。

我有一些带有多个父节点和子节点的 XML,我只需要读取其中一个节点并将其全部连接成一个字符串。我尝试了许多不同的方法来让它遍历两个父节点并从需要从中读取数据的单个子节点中提取数据。我正在使用 XmlReader 类,因为这是我能够在没有太多问题的情况下阅读它的最简单方法。

这是我要阅读的 XML:

<platforms>
<platform>
<api_detail_url>
<![CDATA[ http://www.giantbomb.com/api/platform/3045-20/ ]]>
</api_detail_url>
<id>20</id>
<name>
<![CDATA[ Xbox 360 ]]>
</name>
<site_detail_url>
<![CDATA[ http://www.giantbomb.com/xbox-360/3045-20/ ]]>
</site_detail_url>
<abbreviation>
<![CDATA[ X360 ]]>
</abbreviation>
</platform>
<platform>
<api_detail_url>
<![CDATA[ http://www.giantbomb.com/api/platform/3045-86/ ]]>
</api_detail_url>
<id>86</id>
<name>
<![CDATA[ Xbox Live Marketplace ]]>
</name>
<site_detail_url>
<![CDATA[
http://www.giantbomb.com/xbox-live-marketplace/3045-86/
]]>
</site_detail_url>
<abbreviation>
<![CDATA[ XBLM ]]>
</abbreviation>
</platform>
</platforms>

这是我目前阅读它的尝试:

if(reader.ReadToDescendant("platform"))
{
    do
    {
        i++;
        reader.ReadToDescendant("name");
        reader.ReadStartElement("name");
        gPlat = gPlat + reader.Value + Environment.NewLine;
        reader.ReadToFollowing("platform");
    }
    while (reader.ReadToNextSibling("platform"));
}

如果它在 do/while 循环中有任何类型的其他读取器函数/方法,我似乎无法让它通过两个“平台”节点循环,如果我将它留空,它可以正常循环而没有任何问题(i 变量是用来测试这个)

我的目标是一个以两个名称子节点作为值的连接字符串,但它只循环一次,完全跳过第二个“名称”节点。我无法更改 XML,因为它是由 Web API 返回的。

任何帮助深表感谢。

4

2 回答 2

4

你为什么不使用linq?

第一项:

XDocument doc = XDocument.Parse(xml);
var name = doc.Root
           .Elements("platform")
           .Select(x => x.Element("name").Value)
           .First();

所有项目:

XDocument doc = XDocument.Parse(xml);
var platforms = doc.Root
           .Elements("platform")
           .Select(x => x.Element("name").Value)
           .ToList();
于 2013-05-16T18:44:33.680 回答
1

你有一个额外的阅读,我评论了:

if (reader.ReadToDescendant("platform"))
{
    do
    {
        i++;
        reader.ReadToDescendant("name");
        reader.ReadStartElement("name");
        gPlat = gPlat + reader.Value + Environment.NewLine;
        //reader.ReadToFollowing("platform");
    }
    while (reader.ReadToFollowing("platform"));
}            

结果:

Xbox 360 
Xbox Live Marketplace 
于 2013-05-16T18:27:13.683 回答