2016-07-27 126 views
0

所以我刚刚开始使用c#大约一天前,并没有太多的问题,但目前为止我正在为Discord的机器人工作,它将从api中提取口袋妖怪信息。我目前正在通过xml遍历。这里的XML我想一起工作的一部分:通过迭代访问Xml节点c#

<?xml version="1.0" encoding="UTF-8"?> 
    <root> 
     <stats> 
      <stat> 
       <url>https://pokeapi.co/api/v2/stat/6/</url> 
       <name>speed</name> 
      </stat> 
      <effort>0</effort> 
      <base_stat>100</base_stat> 
     </stats> 
    </root> 

这基本上是我的XML文档的删节版,但也有对“统计”的多个节点。我想循环统计节点并且拉出统计的名字和基础统计的值。我迄今为止所尝试的所有内容都会引发一个空的异常错误。我无法理解如何正确解析xml,所以任何帮助都会大大受到重视。也只是为了额外的信息,我正在使用XmlDocuments。这里的基本上是香港专业教育学院试过到目前为止:

XmlDocument pokemon = new XmlDocument(); 
pokemon.Load("c:\\document.xml"); 
XmlNodeList xmlNodes = pokemon.SelectNodes("/root/stats"); 
int count = 0; 
foreach (XmlNode xmlNode in xmlNodes) 
{ 
    temp.stats[count].val = xmlNode["/stat/name"].InnerText; 
    temp.stats[count++].num = xmlNode["base_stat"].InnerText; 
} 

温度是类型戳和统计仅仅是一个类型的我做了一个其中有两个字符串,一个用于统计的名称,另一个用于统计的价值。我能够很好地从xml文档访问其他东西,但是我无法从共享相同名称的节点拉取。

+0

你能否展示一下你到目前为止已经尝试过的一些内容,以便我们了解什么是失败?指出错误发生的地方?否则很难知道你有什么问题。 –

+0

我编辑的代码基本上显示了我做了什么。感谢您及时的回复! – Thomas

+0

我基本上试图做到这一点:http://stackoverflow.com/questions/14806661/looping-through-xml-document,但我需要访问比这篇文章显示低一级。 – Thomas

回答

0

我相信这将设置你在正确的道路上:

XmlNodeList xmlNodes = pokemon.SelectNodes(@"//root/stats"); 
int count = 0; 

foreach (XmlNode xmlNode in xmlNodes) 
{ 
    temp.stats[count].val = xmlNode.SelectSingleNode("stat/name").InnerText; 
    temp.stats[count++].num = xmlNode.SelectSingleNode("base_stat").InnerText; 
} 

首先,参考使用XPath根节点,你需要双斜杠//。其次,你需要使用xmlNode.SelectSingleNode(string xPath),你的XPath不应该有前导斜杠。

+0

似乎仍在抛出NullReferenceException – Thomas

+0

它在哪里抛出它(代码中的哪一行)? –

+0

this line:temp.stats [count] .val = xmlNode.SelectSingleNode(“stat/name”)。InnerText;和这一个:temp.stats [count ++]。num = xmlNode.SelectSingleNode(“base_stat”)。InnerText; – Thomas