1
我试图构建一个简单的XML来控制我的CF应用程序中的解析器。 在字符串IM下面的代码试图解析如下所示:使用XMLReader解析问题(使用ReadSubTree)
"<Panel><Label>Text1</Label><Label>Text2</Label></Panel>"
我想这段代码的结果将是有两个标签的面板。 但问题是当解析第一个标签时,subreader.Read()在ParsePanelElementh方法中返回false,因此它脱离了while语句。 由于即时通讯新的XMLReader我一定会错过一些非常简单的东西。 任何帮助将被认为是!
平安。
static class XMLParser
{
public static Control Parse(string aXmlString)
{
XmlReader reader = XmlReader.Create(new StringReader(aXmlString));
return ParseXML(reader);
}
public static Control ParseXML(XmlReader reader)
{
using (reader)
{
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
if (reader.LocalName == "Panel")
{
return ParsePanelElement(reader);
}
if (reader.LocalName == "Label")
{
return ParseLabelElement(reader);
}
}
}
}
return null;
}
private static Control ParsePanelElement(XmlReader reader)
{
var myPanel = new Panel();
XmlReader subReader = reader.ReadSubtree();
while (subReader.Read())
{
Control subControl = ParseXML(subReader);
if (subControl != null)
{
myPanel.Controls.Add(subControl);
};
}
return myPanel;
}
private static Control ParseLabelElement(XmlReader reader)
{
reader.Read();
var myString = reader.Value as string;
var myLabel = new Label();
myLabel.Text = myString;
return myLabel;
}
}
结果IM刚开仅与第一标签面板。在ParsePanelElement我读subReader而不是原来的读者。既然它是一个简单的例子,你能修复我的代码吗,所以我明白我做错了什么? – no9 2010-04-29 10:55:22
我以为我在ParseLabelElement中发现了这个问题。 我替换为:“reader.Read(); var myString = reader.Value as string;”到“var myString = reader.ReadElementContentAsString();”。 但问题仍然存在,因为当这被称为读者位置改变到下一个节点(在我的情况下第二个标签)。有没有办法读取节点值并保持相同的位置? – no9 2010-04-29 12:34:22
是reader.Read()在那一点上必需的吗?我现在无法检查,因为我没有Visual Studio在这里。看起来在'ParsePanelElement'中你读了第一个节点,当'ParsePanelElement'调用'ParseXml'时你读了另一个节点,并且当'parseXml'调用'ParseLabelElement'你读了另一个节点。 另外,这是否使用声明工作?我认为只有在声明一个新的分配对象时才使用语句?如果确实有效,这也可能是你的问题的原因。 using语句关闭子阅读器,while循环退出。 – Roy 2010-04-29 21:27:50