XmlReader ReadStartElement 导致 XmlException
我正在 Silverlight 项目中使用 XmlReader 编写文件读取器。但是,我遇到了一些错误(特别是围绕 XmlReader.ReadStartElement 方法),这使我相信我误解了如何在某个地方使用它。
基本上,这是我正在使用的 Xml 格式的示例:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<root>
<EmptyElement />
<NonEmptyElement Name="NonEmptyElement">
<SubElement Name="SubElement" />
</NonEmptyElement>
</root>
这是一些代码的示例,其使用方式与我使用它的方式相同:
public void ReadData(XmlReader reader)
{
// Move to root element
reader.ReadStartElement("root");
// Move to the empty element
reader.ReadStartElement("EmptyElement");
// Read any children
while(reader.ReadToNextSibling("SubEmptyElement"))
{
// ...
}
// Read the end of the empty element
reader.ReadEndElement();
// Move to the non empty element
reader.ReadStartElement("NonEmptyElement"); // NOTE: This is where I get the error.
// ...
}
因此,本质上,我只是尝试读取每个元素和任何元素包含儿童。我在突出显示的点处收到的错误如下:
错误描述
[Xml_InvalidNodeType] 参数:无、10,8 调试资源字符串不可用。通常,键和参数提供了足够的信息来诊断问题。请参阅http: //go.microsoft.com/fwlink/?linkid=106663&Version=4.0.51204.0&File=System.Xml.dll&Key=Xml_InvalidNodeType
错误堆栈跟踪
at System.Xml.XmlReader.ReadStartElement(字符串名称) 在----------------
任何对此的建议或指导将不胜感激。
编辑 由于该读取器需要相当通用,因此可以假设 Xml 可能包含 EmptyElement 的子元素。因此,读取任何 SubEmptyElements 的尝试应该是有效的。
I'm writing a file reader using the XmlReader in a Silverlight project. However, I'm getting some errors (specifically around the XmlReader.ReadStartElement method) and it's causing me to believe that I've misunderstood how to use it somewhere along the way.
Basically, here is a sample of the format of the Xml I am using:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<root>
<EmptyElement />
<NonEmptyElement Name="NonEmptyElement">
<SubElement Name="SubElement" />
</NonEmptyElement>
</root>
And here is a sample of some code used in the same way as how I am using it:
public void ReadData(XmlReader reader)
{
// Move to root element
reader.ReadStartElement("root");
// Move to the empty element
reader.ReadStartElement("EmptyElement");
// Read any children
while(reader.ReadToNextSibling("SubEmptyElement"))
{
// ...
}
// Read the end of the empty element
reader.ReadEndElement();
// Move to the non empty element
reader.ReadStartElement("NonEmptyElement"); // NOTE: This is where I get the error.
// ...
}
So, essentially, I am simply trying to read each element and any contained children. The error I get at the highlighted point is as follows:
Error Description
[Xml_InvalidNodeType]
Arguments: None,10,8
Debugging resource strings are unavailable. Often the key and arguments provide sufficient information to diagnose the problem. See http://go.microsoft.com/fwlink/?linkid=106663&Version=4.0.51204.0&File=System.Xml.dll&Key=Xml_InvalidNodeType
Error Stack Trace
at System.Xml.XmlReader.ReadStartElement(String name)
at ----------------
Any advice or direction on this would be greatly appreciated.
EDIT
Since this reader needs to be fairly generic, it can be assumed that the Xml may contain elements that are children of the EmptyElement. As such, the attempt at reading any SubEmptyElements should be valid.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
不是
的同级,因此
将被完全跳过,并且对ReadEndElement()
的调用将读取结束元素。当您尝试随后读取“NonEmptyElement”时,没有剩下任何元素,并且您将收到 XmlException: {"'None' is an invalid XmlNodeType. Line 8,position 1."}
另请注意,因为
< ;EmptyElement/>
为空,当您使用 ReadStartElement("EmptyElement") 时,您将读取整个元素,并且不需要使用 ReadEndElement()。我还建议您将阅读器设置配置为 IgnoreWhitespace(如果您还没有这样做),以避免在您不期望的情况下读取(无关紧要的)空白文本节点而带来的任何复杂情况。
尝试将 NonEmptyElement 的 Read 向上移动:
如果您只想跳过
中的任何内容,无论其实际上是否为空,请使用ReadToFollowing
:更新:这里是具有更清晰的数据模型的更完整的示例。也许这更接近您的要求。
XMLFile1.xml:
程序.cs:
<SubElement/>
is not a sibling of<EmptyElement>
, so<NonEmptyElement>
is going to get skipped entirely, and your call toReadEndElement()
will read the end element</root>
. When you try to subsequently read "NonEmptyElement", there are no elements left, and you'll get an XmlException: {"'None' is an invalid XmlNodeType. Line 8, position 1."}Note also that since
<EmptyElement/>
is empty, when you ReadStartElement("EmptyElement"), you'll read the whole element, and you won't need to use ReadEndElement().I'd also recommend that you configure your reader settings to IgnoreWhitespace (if you're not already doing so), to avoid any complications introduced by reading (insignificant) whitespace text nodes when you aren't expecting them.
Try moving the Read of NonEmptyElement up:
If you just want to skip anything in
<EmptyElement>
, regardless of whether or not its actually empty, useReadToFollowing
:Update: Here's a fuller example with a clearer data model. Maybe this is closer to what you're asking for.
XMLFile1.xml:
Program.cs: