不支持C#XmlNodeReader异常节点类型
我得到一个异常,当尝试运行以下代码时,节点类型“None”不受支持不支持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包含有效
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:读取自动关闭元素不会引发“不支持节点类型”异常。