首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >XML读取器未正确读取子节点

XML读取器未正确读取子节点
EN

Stack Overflow用户
提问于 2013-05-17 01:50:57
回答 2查看 3.3K关注 0票数 3

我在将一些XML读取到Windows 8应用商店应用时遇到问题。

我得到了一些具有多个父节点和子节点的XML,在这些XML中,我只需要读取其中一个节点并将其连接到一个字符串中。我尝试了许多不同的方法,让它循环遍历两个父节点,并从需要读取数据的单个子节点中提取数据。我使用XmlReader类,因为这是我能够阅读它而不会遇到太多问题的最简单的方法。

这是我正在尝试读取的XML:

代码语言:javascript
运行
复制
<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>

这是我目前正在尝试阅读的内容:

代码语言:javascript
运行
复制
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循环中有任何其他类型的读取器函数/方法,我似乎不能让它在两个"platform“节点上循环,如果我把它留空,它可以很好地循环,没有任何问题(i变量用来测试这一点)

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

任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-17 02:44:34

为什么不使用linq呢?

第一项:

代码语言:javascript
运行
复制
XDocument doc = XDocument.Parse(xml);
var name = doc.Root
           .Elements("platform")
           .Select(x => x.Element("name").Value)
           .First();

所有项目:

代码语言:javascript
运行
复制
XDocument doc = XDocument.Parse(xml);
var platforms = doc.Root
           .Elements("platform")
           .Select(x => x.Element("name").Value)
           .ToList();
票数 4
EN

Stack Overflow用户

发布于 2013-05-17 02:27:14

你有一个额外的阅读,我注释掉了:

代码语言:javascript
运行
复制
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"));
}            

结果:

代码语言:javascript
运行
复制
Xbox 360 
Xbox Live Marketplace 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16594180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档