似乎每次使用XMLReader时,我都会经过一堆反复试验,试图弄清楚我将要阅读的内容与正在阅读的内容还是刚刚阅读的内容。我总是在最后弄清楚它,但是在多次使用它之后,当我调用各种函数时,我似乎仍然不太了解XMLReader的实际功能。例如,当我第一次调用Read时,如果它读取元素开始标签,是现在在元素标签的末尾,还是准备开始读取元素的属性?如果我调用GetAttribute,它是否知道属性的值?如果此时我调用ReadStartElement会发生什么?它会跳过所有属性,完成读取开始元素还是寻找下一个元素?如果我想阅读许多元素怎么办-尝试阅读下一个元素并确定其名称的最佳方法是什么?读取后再加上IsStartElement会起作用,还是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似乎移到了machine元素的内容,导致它永远不会被解析。此外,如果跳过MoveToContent,则会收到错误消息:“'Element'是无效的XmlNodeType。”试图读取ElementString,我无法完全解释。
下一个问题是,在读取第一个part元素时,ReadElementString似乎将读取器放置在读取后的下一个part元素的开头。这会导致读者。在下一个循环的开始处阅读会跳过下一个零件元素,直接跳到最后一个零件元素。因此,此代码的最终输出是:
零件代码01a:右臂
部件号03:大脚趾
这是我试图理解的XMLReader的confusign行为的主要示例。
最佳答案
事情就是这样……我已经编写了大量的序列化代码(包括大量的xml处理),我发现自己在中的位置与您在同一条船上的完全一样。因此,我有一个非常简单的指导:没有。
我会很乐意使用XmlWriter
作为快速编写xml的方法,但是在选择再次实现IXmlSerializable
之前,我会先走一遍热煤-我会简单地编写一个单独的DTO
并将数据映射到其中。这也意味着该模式(用于“mex”,“wsdl”等)是免费提供的。
关于c# - 我永远无法预测XMLReader的行为。有任何了解技巧吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2125187/