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
Anonymous
November 19, 2007
PingBack from http://msdnrss.thecoderblogs.com/2007/11/19/table-trouble/Anonymous
November 19, 2007
Hmmmm... is their an outlining function being added to OneNote?? Exciting!! It just keeps getting better.Anonymous
November 21, 2007
Second hint: check out the next post after this one. JohnAnonymous
November 29, 2007
One bug report we've been trying to track down has to do with sections from Notebooks on Sharepoint servers