C#XmlNodeReader异常不支持NodeType

时间:2010-11-27 18:59:01

标签: c# xml exception

尝试运行以下代码时,我得到的异常是NodeType“None”不受支持。

public int ObjectContentI(string XmlPath)
{
    XmlNodeReader xnr = new XmlNodeReader(this.xmlr.SelectSingleNode(XmlPath));
    return xnr.ReadElementContentAsInt();
}

this.xmlr是一个XmlDocument,其中成功加载了一个文档。 XmlPath包含有效的XPath URL。

如何设置NodeType(xnr.NodeType是readonly)还是我做错了什么?

我的部分XML:

<?xml version="1.0" encoding="utf-8" ?>
<ship weapons="0">
  <cost>
    <metal>250</metal>
    <crystal>100</crystal>
  </cost>
  <health>
    <shields>750</shields>
    <sregene>10</sregene>
    <hitpoints>1000</hitpoints>
    <oxygen cps="2">25000</oxygen>
  </health>

我的XPath:“/ ship / health / shields / text()”

2 个答案:

答案 0 :(得分:1)

嗯,你的方法是正确的但不完全。

我们假设

XmlNode n = myXMLDoc.SelectSingleNode("/ship/health/shields/");

n.InnerXMLn.InnerText应该为您提供所需的信息。

答案 1 :(得分:0)

虽然conqenator为您提供了修复问题的代码,但后面的原因是为什么它首先不起作用:

如果你没有在XmlNodeReader或从XmlReader派生的任何类上调用Read方法,你将总是得到一个XmlNodeType.None NodeType,这就是错误的原因。要修复你提供的代码并获得一个int,这就是代码需要的样子:

public int ObjectContentI(string XmlPath)
{
    int result;
    using(XmlNodeReader xnr = new XmlNodeReader(this.xmlr.SelectSingleNode(XmlPath))){
        while(xnr.Read()){
            result = xnr.ReadElementContentAsInt();
        }
    }
    return result;
}

请注意,获取此wroking的XPath需要更改为/ship/health/shields,因为ReadElementContentAsInt()会返回元素的内容,并且无法在文本节点上运行,这是您在使用时获得的/ship/health/shields/text() 1}}。

请注意,我还将XmlNodeReader包装在一个using块中,一旦完成它就会处理XmlNodeReader以释放资源。