将一些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循环中有任何其他的读取器函数/方法,我似乎无法通过两个“平台”节点进行循环,如果我将其留空,它会毫无问题地循环(我用变量来测试这个)
我所瞄准的是一个以两个名称子节点作为值的连接字符串,但它只循环一次,完全跳过第二个“名称”节点。我无法更改XML,因为它是由Web API返回的。
非常感谢任何帮助。
答案 0 :(得分: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();
答案 1 :(得分: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