Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不支持C#XmlNodeReader异常节点类型_C#_Xml_Exception - Fatal编程技术网

不支持C#XmlNodeReader异常节点类型

不支持C#XmlNodeReader异常节点类型,c#,xml,exception,C#,Xml,Exception,我得到一个异常,当尝试运行以下代码时,节点类型“None”不受支持 public int ObjectContentI(string XmlPath) { XmlNodeReader xnr = new XmlNodeReader(this.xmlr.SelectSingleNode(XmlPath)); return xnr.ReadElementContentAsInt(); } this.xmlr是一个XmlDocument,其中成功加载了一个文档。XmlPath包含有效

我得到一个异常,当尝试运行以下代码时,节点类型“None”不受支持

public int ObjectContentI(string XmlPath)
{
    XmlNodeReader xnr = new XmlNodeReader(this.xmlr.SelectSingleNode(XmlPath));
    return xnr.ReadElementContentAsInt();
}
this.xmlr是一个XmlDocument,其中成功加载了一个文档。XmlPath包含有效的XPath url

我如何设置节点类型(xnr.NodeType是只读的),还是我做了其他错误的事情

我的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>

250
100
750
10
1000
25000

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

好吧,您的方法是正确的,但并不完全正确

让我们假设

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

n.InnerXML
n.InnerText
应能满足您的需要。

尽管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;
}
请注意,获取此写入的XPath需要更改为
/ship/health/shields
,因为
ReadElementContentAsInt()
返回元素的内容,并且不会在文本节点上工作,这是使用
/ship/health/shields/Text()时得到的


请注意,我还将XmlNodeReader包装在一个using块中,一旦您使用完XmlNodeReader,该块将处理掉它以释放资源。

虽然这不是一个答案,但我建议,如果您的解决方案允许,我强烈建议您使用LINQ to XML。在.NET中使用Xml时,它消除了几乎所有的痛点。设置节点类型没有意义,因为这样做会涉及修改底层Xml(这是一个读取器,而不是编写器)。我猜出现异常是因为您试图读取一个没有内部文本(self-closed?)的节点的值,尽管我不是100%确定您是否可以发布XPath字符串,因为您得到的错误意味着您返回的XmlNodeType为None,这很可能是因为XPath不正确。还发布一部分XML,以便更容易地找出正确的xpath。将xpath和部分XML发布到初始post中。@Cameron:读取自动关闭元素不会引发“不支持节点类型”异常。