Table trouble


 

I had to relearn the lesson of paying attention to details recently.  I was writing some code to work with OneNote’s table XML via extensibility, and could not get my code to work correctly.  After a couple of days of working on this in my spare time, I was just about ready to give up.  I wound up in the situation in which I could add a row, but OneNote would only recognize a single cell from that row.  In other words, the number of rows would increase by 1 as desired, but the number of cells would only increase by 1 as well, instead of increasing by the number of columns.


 


I was using this code to create a new row node to add to an existing table:


 


XmlNode newChildRow;


newChildRow = pageDoc.CreateElement(“one:Row”, strNamespace);


for (int i = 0; i < numColumns; i++)


{


XmlNode newCell = pageDoc.CreateElement(“one:Cell”);


newChildRow.AppendChild(newCell);


XmlNode newOEChildren = pageDoc.CreateElement(“one:OEChildren”);


newChildRow.AppendChild(newOEChildren);


XmlNode newOE = pageDoc.CreateElement(“one:OE”);


newChildRow.AppendChild(newOE);


XmlNode newT = pageDoc.CreateElement(“one:T”);


newChildRow.AppendChild(newT);


}


 


When I would look at the page XML after adding the node, this is what the final node looked like:


<one:Row>


<one:Cell />


<one:OEChildren />


<one:OE />


<one:T />


<one:Cell />


<one:OEChildren />


<one:OE />


<one:T />


<one:Cell />


<one:OEChildren />


<one:OE />


<one:T />


</one:Row>


 


 


And that is valid XML. 


 


 


But bombs in OneNote.  I would query the table for the number of rows after my code would run, and it would be what I expected.  But the number of data cells would only go up by 1.  I thought this was timing related or related to the cache being up to date but not the file and spent a lot of time working on that faulty supposition. 


 


Then I started looking very closely at the XML.  Check it out closely: the first cell is a child to the row, but the first OEChildren is a sibling to the Cell, where it really should be a child.  Sigh.


 


Here’s the correct code:


 


            XmlNode newChildRow;


            newChildRow = pageDoc.CreateElement(“one:Row”, strNamespace);


            for (int i = 0; i < numColumns; i++)


            {


                XmlNode newCell = pageDoc.CreateElement(“one:Cell”,strNamespace );


                newChildRow.AppendChild(newCell);


                XmlNode newOEChildren = pageDoc.CreateElement(“one:OEChildren”, strNamespace);


                newCell.AppendChild(newOEChildren);


                XmlNode newOE = pageDoc.CreateElement(“one:OE”, strNamespace);


                newOEChildren.AppendChild(newOE);


                XmlNode newT = pageDoc.CreateElement(“one:T”, strNamespace);


                newOE.AppendChild(newT);


            }


 


Notice how the children are correctly appended to the correct parent.


 


And the final XML:


<one:Row>


<one:Cell>


<one:OEChildren>


<one:OE>


                            <one:T />


               </one:OE>


      </one:OEChildren>


  </one:Cell>


<one:Cell>


<one:OEChildren>


<one:OE>


                            <one:T />


               </one:OE>


      </one:OEChildren>


 </one:Cell>


</one:Row>


 


 Sigh.  This all boiled down to a simple child/parent problem with XML. 


 


Long time readers will wonder why I was working with table XML – let me just drop a hint to expect some useful output from this exercise soon…


 


Questions, comments, concerns and criticisms always welcome,


John

Comments (4)

  1. DY says:

    Hmmmm… is their an outlining function being added to OneNote??  Exciting!! It just keeps getting better.

  2. JohnGuin says:

    Second hint: check out the next post after this one.

    John

  3. One bug report we’ve been trying to track down has to do with sections from Notebooks on Sharepoint servers