【发布时间】:2011-01-08 16:07:42
【问题描述】:
似乎每次我使用 XMLReader 时,我都会经历一堆尝试和错误,试图弄清楚我将要阅读的内容与我正在阅读的内容以及我刚刚阅读的内容。我最后总能弄明白,但在我多次使用它之后,我似乎并没有牢牢掌握调用各种函数时 XMLReader 实际在做什么。例如,当我第一次调用 Read 时,如果它读取元素开始标记,它现在是在元素标记的末尾,还是准备开始读取元素的属性?如果我调用 GetAttribute,它是否知道属性的值?如果此时我调用 ReadStartElement 会发生什么?它会完成读取起始元素,还是寻找下一个元素,跳过所有属性?如果我想读取多个元素怎么办?尝试读取下一个元素并确定其名称的最佳方法是什么。 IsStartElement 之后的 Read 会起作用,还是 IsStartElement 会返回有关我刚刚读取的元素之后的节点的信息?
如您所见,我确实缺乏对 XMLReader 在其读取的各个阶段所处的位置以及其状态如何受到各种读取函数的影响的理解。是否有一些我根本没有注意到的简单模式?
这是另一个问题示例(取自回复):
string input = "<machine code=\"01\">The Terminator" +
"<part code=\"01a\">Right Arm</part>" +
"<part code=\"02\">Left Arm</part>" +
"<part code=\"03\">Big Toe</part>" +
"</machine>";
using (System.IO.StringReader sr = new System.IO.StringReader(input))
{
using (XmlTextReader reader = new XmlTextReader(sr))
{
reader.WhitespaceHandling = WhitespaceHandling.None;
reader.MoveToContent();
while(reader.Read())
{
if (reader.Name.Equals("machine") && (reader.NodeType == XmlNodeType.Element))
{
Console.Write("Machine code {0}: ", reader.GetAttribute("code"));
Console.WriteLine(reader.ReadElementString("machine"));
}
if(reader.Name.Equals("part") && (reader.NodeType == XmlNodeType.Element))
{
Console.Write("Part code {0}: ", reader.GetAttribute("code"));
Console.WriteLine(reader.ReadElementString("part"));
}
}
}
}
第一个问题,机器节点被完全跳过。 MoveToContent 似乎移动到机器元素的内容,导致它永远不会被解析。此外,如果您跳过 MoveToContent,则会收到错误消息:“'Element' is an invalid XmlNodeType.”试图读取元素字符串,我无法完全解释。
下一个问题是,在读取第一个部分元素时,ReadElementString 似乎在读取后将阅读器定位在下一个部分元素的开头。这会导致 reader.Read 在下一个循环开始时跳过下一个部分元素,直接跳到最后一个部分元素。所以这段代码的最终输出是:
零件代码 01a:右臂
零件代码 03:大脚趾
这是我试图理解的 XMLReader 混淆行为的一个典型例子。
【问题讨论】: