i have written xml file using xmlwriter. here code:
public void writexml(xmlwriter writer) { writer.writestartelement("element1"); writer.writeattributestring("attrs1", attrs1); writer.writeattributestring("attrs2", attrs2); if (!string.isnullorwhitespace("element2")) { writer.writestartelement("element2"); writer.writecdata(element2); writer.writeendelement(); } if (!string.isnullorwhitespace("element3")) { writer.writestartelement("element3"); writer.writecdata(element3); writer.writeendelement(); } element4.writexml(writer); element5.writexml(writer); writer.writeendelement(); }
as can see, element4 calls method named "writexml()". here method:
public void writexml(xmlwriter writer) { if (m_propertyvaluelist.count > 0) { writer.writestartelement("element4"); foreach (var p in m_propertyvaluelist) { if (p.currentvalue != null) { writer.writestartelement("property"); writer.writeattributestring("name", p.propertyname); writer.writeattributestring("value", p.currentvalue.tostring()); writer.writeendelement(); } } writer.writeendelement(); } }
notice checks p.currentvalue != null. if null element should written empty element. in case, p.currentvalue null want empty element. see in xml output below writing element . me looks writing empty element, please correct me if i'm wrong here.
the xml file output looks this:
<?xml version="1.0" encoding="utf-8"?> -<element> -<element 1 attrs1="some info" attrs2="more info"> -<element2> +<![cdata[]]> </element2> -<element3> -<![cdata[ ]]> </element3> <element4/> </element1> </element>
then create method reading xml file in. breaks. fine reading element, element1, element2 , element3. however, when gets element4, start having issues. explain below.
here xmlreader method:
public void readxml(xmlreader reader) { if (reader.isstartelement("element1")) { // // values of <element1> attributes // attrs1= reader.getattribute("attrs1"); attrs2 = reader.getattribute("attrs2"); // // read past <element1> // reader.read(); while (true) { if (reader.isstartelement("element2")) { description = reader.readelementcontentasstring(); } else if (reader.isstartelement("element3")) { source = reader.readelementcontentasstring(); } else if (reader.isstartelement("element4")) && (!reader.isemptyelement)) { element4.readxml(reader); } else if ((reader.isstartelement("element5")) && (!reader.isemptyelement)) { element5.readxml(reader); } else { reader.movetocontent(); reader.readendelement(); break; } } } else { throw new xmlexception("expected <element1> element not present"); } }
notice if element4 isstartelement , if it's not empty element call element4.readxml(). here method:
public void readxml(xmlreader reader) { if ((reader.isstartelement("element4")) && (!reader.isemptyelement)) { reader.read(); while (reader.isstartelement("property")) { string propertyname = reader.getattribute("name"); string propertyvalue = reader.getattribute("value"); setvalue(propertyname, propertyvalue); reader.read(); } // // read </element4> // reader.movetocontent(); reader.readendelement(); } }
but since element4 empty method never gets called. continue else{} statement , break when gets reader.readendelement(); there error message is:
"message: testmethod mytestmethodname threw exception: system.xml.xmlexception 'element' invalid xmlnodetype. line 8, position 6."
so questions are:
- is because element empty? if so, how close or read past empty element?
- where reading element4 if it's start element , if it's not empty....if remove (!reader.isemptyelement) infinite loop. continues call element4.readxml(reader). why this?
- how fix , continue past can read rest of elements.
where read elements xml file needed add else if condition handle if element start element , if element empty. checking if wasn't empty. didn't know how handle being empty. when conditions met had reader.read() tell app read element <element4/>
.
here looks like:
else if (reader.isstartelement("element4")) && (reader.isemptyelement)) { reader.read(); }
Comments
Post a Comment