c# - Using XmlReader how do I read past an empty element? -


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:

  1. is because element empty? if so, how close or read past empty element?
  2. 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?
  3. 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