通过迭代访问Xml节点c#

时间:2016-07-27 16:53:13

标签: c# xml

所以我刚刚开始使用c#一天前到目前为止还没有太多问题,但是我正在为Discord开发一个机器人,它会从api中提取口袋妖怪信息。我目前仍然坚持遍历xml。这是我尝试使用的xml的一部分:

<?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文档的删节版本,但有&#34; stats&#34;有多个节点。我想循环统计节点并拉出stat的名称和base stat的值。到目前为止,我尝试的所有内容都会抛出一个null异常错误。我无法理解如何正确解析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;
}

temp属于poke类型,stats只是我制作的类型,其中包含两个字符串,一个用于stat的名称,另一个用于stat的值。我能够从xml文档中完全正常地访问其他内容,但是我在从具有相同名称的节点中拉出时遇到了麻烦。

1 个答案:

答案 0 :(得分: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不应该有前导斜杠。