c# - problem parsing with XMLReader (using ReadSubTree) -
im trying build simple xml controls parser in cf application. in code below string im trying parse looks this:
"<panel><label>text1</label><label>text2</label></panel>"
the result want code panel 2 labels. problem when first label parsed subreader.read() returns false in parsepanelelementh method, , falls out of while statement. since im new xmlreader must missing simple. apreciated !
peace.
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 string; var mylabel = new label(); mylabel.text = mystring; return mylabel; } }
the problem reader reads twice, once in parsepanelelement
, once in parsexml
. way parse panel, skip first label , add second label.
[edit may 3rd 2010]
this code works under visual studio 9. (i have moved using clause)
static class program { /// <summary> /// main entry point application. /// </summary> [stathread] static void main() { control test = xmlparser.parse("<panel><label>text1</label><label>text2</label></panel>"); (int32 = 0; < test.controls.count; i++) { system.diagnostics.debug.writeline("control " + + ": " + test.controls[i].gettype().fullname + " [text = " + test.controls[i].text + "]"); } } static class xmlparser { public static control parse(string axmlstring) { control result = null; using (stringreader strreader = new stringreader(axmlstring)) { using (xmlreader reader = xmlreader.create(strreader)) { result = parsexml(reader); } } return result; } public static control parsexml(xmlreader 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(); using (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 string; var mylabel = new label(); mylabel.text = mystring; return mylabel; } } }
Comments
Post a Comment