C# XML读取器未正确读取子节点

C# XML读取器未正确读取子节点,c#,xml,windows-8,windows-runtime,C#,Xml,Windows 8,Windows Runtime,我在将一些XML读入Windows 8应用商店应用程序时遇到问题 我有一些包含多个父节点和子节点的XML,在这些XML中,我只需要读取一个节点并将其连接到一个字符串中。我尝试了许多不同的方法让它在两个父节点之间循环,并从需要读取数据的单个子节点提取数据。我使用XmlReader类,因为这是最简单的读取方法,不会出现太多问题 这是我试图阅读的XML: <platforms> <platform> <api_detail_url> <![CDATA[ htt

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

我有一些包含多个父节点和子节点的XML,在这些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>
如果它在do/while循环中有任何其他读取器函数/方法,我似乎不能让它通过两个“平台”节点进行太多的循环,如果我将其留空,它将毫无问题地进行循环(I变量用于测试)

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


非常感谢您的帮助。

您额外阅读了一篇文章,我将其注释掉:

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 

为什么不使用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();

我认为
ReadToFollowing
+
ReadToNextSibling
一起将跳过每隔一个“平台”节点。使用4+尝试XML“需要确认的平台节点。我用7或8尝试过它,每次都做相同的事情。无论我尝试什么,它都只读取第一个值。这是可行的,但它读取所有具有名称子节点的内容,还有其他具有相同名称子节点的节点包含不同的数据,是否有方法阻止它读取到结束时“平台”节点?@Alexev-我更改了我的答案以解决您的实现问题。@Alexev-不要忘记接受答案来结束问题。(您只能接受一个答案)。如果您有足够的声誉,您也可以选择任何有用的答案。一位朋友向我展示了这种方法,它也很有效,非常感谢!
XDocument doc = XDocument.Parse(xml);
var platforms = doc.Root
           .Elements("platform")
           .Select(x => x.Element("name").Value)
           .ToList();