我永远无法预测XMLReader的行为。关于理解有什么建议吗?

似乎每次我使用XMLReader时,我都会经历一系列尝试和错误,试图找出我将要阅读的内容、我正在阅读的内容和我刚刚阅读的内容。我总是在最后找到答案,但在使用它无数次之后,当我调用各种函数时,我似乎并没有很好地理解XMLReader实际上在做什么。例如,当我第一次调用Read时,如果它读取一个元素开始标记,它现在是在元素标记的末尾,还是准备开始读取元素的属性?如果我调用GetAttribute,它知道属性的值吗?如果此时调用ReadStartElement,会发生什么情况?它将完成读取开始元素,还是寻找下一个元素,跳过所有属性?如果我想读取大量元素,那么最好的方法是读取下一个元素并确定其名称。读取后紧接着IsStartElement是否有效,或者IsStartElement是否将返回有关我刚才读取的元素后的节点的信息

正如您所看到的,我对XMLReader在读取的各个阶段所处的位置以及它的状态如何受到各种读取函数的影响缺乏了解。是否有一些我根本没有注意到的简单模式

下面是问题的另一个例子(摘自回复):

string input=“<机器代码=\“01\”>终止符”+
“<零件代码=\“01a\”>右臂</part>”+
“<零件代码=\“02\”>左臂</part>”+
“<零件代码=\'03\”>大脚趾</part>”+
“</machine>”;
使用(System.IO.StringReader sr=new System.IO.StringReader(输入))
{
使用(XmlTextReader=新的XmlTextReader(sr))
{
reader.WhitespaceHandling=WhitespaceHandling.None;
reader.MoveToContent();
while(reader.Read())
{
if(reader.Name.Equals(“machine”)&(reader.NodeType==XmlNodeType.Element))
{
Write(“机器代码{0}:”,reader.GetAttribute(“代码”);
Console.WriteLine(reader.ReadElementString(“machine”);
}
if(reader.Name.Equals(“部分”)&(reader.NodeType==XmlNodeType.Element))
{
Write(“部分代码{0}:”,reader.GetAttribute(“代码”);
Console.WriteLine(reader.ReadElementString(“part”);
}
}
}
}

第一个问题,机器节点被完全跳过。MoveToContent似乎移动到机器元素的内容,导致它永远不会被解析。此外,如果您跳过MoveToContent,您会得到一个错误:“’Element’是一个无效的XmlNodeType。”尝试读取ElementString,我无法解释这一点

下一个问题是,在读取第一个part元素时,ReadElementString似乎在读取后将读取器定位在下一个part元素的开头。这会导致下一个循环开头的reader.Read跳过下一个part元素,直接跳到最后一个part元素。所以这段代码的最终输出是:

零件代码01a:右臂

零件代码03:大脚趾

这是我试图理解的XMLReader混淆行为的一个主要示例

事情是这样的。。。我已经编写了大量的序列化代码(包括大量的xml处理),我发现自己与您完全处于同一条船上。因此,我有一个非常简单的指导:不要

我很乐意使用XmlWriter作为一种快速编写xml的方法,但在下次选择实现IXmlSerializable之前,我会先浏览一下热点——我只需编写一个单独的DTO并将数据映射到其中;它还意味着模式(用于“mex”、“wsdl”等)是免费的

发表评论