XML Text nodes are sometimes wrapped in element tags, sometimes not?

The following code is a method in my application that generates an XML project file from various controls in a window:

//Put together an XML file based on the data in the Main Window project settings

Var xml As New XmlDocument

Var root As XmlNode
root = xml.AppendChild(xml.CreateElement("Project"))

Var ProjectItem As XmlNode
var ProjectItemTextNode as XmlTextNode
Var ClipList As XmlNode
Var ClipInfo As XmlNode
var ClipTextNode as XmlTextNode

//ProjectName
ProjectItem = root.AppendChild(xml.CreateElement("Name"))
ProjectItemTextNode = xml.CreateTextNode(ProjectName.ToText)
ProjectItem.AppendChild(ProjectItemTextNode)

//ProjectFilmGauge
ProjectItem = root.AppendChild(xml.CreateElement("Gauge"))
ProjectItemTextNode = xml.CreateTextNode(ProjectFilmGauge.ToText)
ProjectItem.AppendChild(ProjectItemTextNode)

//ProjectColorMode
ProjectItem = root.AppendChild(xml.CreateElement("ColorMode"))
ProjectItemTextNode = xml.CreateTextNode(ProjectColorMode.ToText)
ProjectItem.AppendChild(ProjectItemTextNode)

//ProjectColorDepth
ProjectItem = root.AppendChild(xml.CreateElement("ColorDepth"))
ProjectItemTextNode = xml.CreateTextNode(ProjectColorDepth.ToText)
ProjectItem.AppendChild(ProjectItemTextNode)

//ProjectHDRMode
ProjectItem = root.AppendChild(xml.CreateElement("HDRMode"))
ProjectItemTextNode = xml.CreateTextNode(ProjectHDRMode.ToText)
ProjectItem.AppendChild(ProjectItemTextNode)

//ProjectResolution
ProjectItem = root.AppendChild(xml.CreateElement("Resolution"))
ProjectItemTextNode = xml.CreateTextNode(ProjectResolutionPreset.ToText)
ProjectItem.AppendChild(ProjectItemTextNode)

//ProjectResX
ProjectItem = root.AppendChild(xml.CreateElement("ResX"))
ProjectItemTextNode = xml.CreateTextNode(ProjectResX.ToText)
ProjectItem.AppendChild(ProjectItemTextNode)

//ProjectResY
ProjectItem = root.AppendChild(xml.CreateElement("ResY"))
ProjectItemTextNode = xml.CreateTextNode(ProjectResY.ToText)
ProjectItem.AppendChild(ProjectItemTextNode)

//ProjectCameraOriginX
ProjectItem = root.AppendChild(xml.CreateElement("CameraOriginX"))
ProjectItemTextNode = xml.CreateTextNode(ProjectCameraOriginX.ToText)
ProjectItem.AppendChild(ProjectItemTextNode)

//ProjectCameraOriginY
ProjectItem = root.AppendChild(xml.CreateElement("CameraOriginY"))
ProjectItemTextNode = xml.CreateTextNode(ProjectCameraOriginY.ToText)
ProjectItem.AppendChild(ProjectItemTextNode)


ClipList = root.AppendChild(xml.CreateElement("ClipList"))

//add the clips to the ClipList
for i as integer = 0 to WMainWindow.lbClipList.RowCount-1
  ClipInfo = ClipList.AppendChild(xml.CreateElement("Clip"))
  ClipInfo.SetAttribute("id", i.ToText)
  
  ClipInfo.AppendChild(xml.CreateElement("ClipName"))
  ClipTextNode = xml.CreateTextNode(WMainWindow.lbClipList.CellTextAt(i,0))
  ClipInfo.AppendChild(ClipTextNode)
  
  ClipInfo.AppendChild(xml.CreateElement("ClipPath"))
  ClipTextNode = xml.CreateTextNode(WMainWindow.lbClipList.CellTextAt(i,1))
  ClipInfo.AppendChild(ClipTextNode)
  
  ClipInfo.AppendChild(xml.CreateElement("ClipInFrame"))
  ClipTextNode = xml.CreateTextNode(WMainWindow.lbClipList.CellTextAt(i,2))
  ClipInfo.AppendChild(ClipTextNode)
  
  ClipInfo.AppendChild(xml.CreateElement("ClipOutFrame"))
  ClipTextNode = xml.CreateTextNode(WMainWindow.lbClipList.CellTextAt(i,3))
  ClipInfo.AppendChild(ClipTextNode)
  
  ClipInfo.AppendChild(xml.CreateElement("ClipFrameNumberPadding"))
  ClipTextNode = xml.CreateTextNode(WMainWindow.lbClipList.CellTextAt(i,4))
  ClipInfo.AppendChild(ClipTextNode)
  
next

//Send this to the formatter, and return
var formattedXML as string = xml.formatXML
return formattedXML

This is the result:

<?xml version="1.0" encoding="UTF-8"?>
<Project xmlns:xml="http://www.w3.org/XML/1998/namespace">
  <Name></Name>
  <Gauge>3</Gauge>
  <ColorMode>0</ColorMode>
  <ColorDepth>0</ColorDepth>
  <HDRMode>0</HDRMode>
  <Resolution>5</Resolution>
  <ResX>14000</ResX>
  <ResY>9000</ResY>
  <CameraOriginX>0</CameraOriginX>
  <CameraOriginY>0</CameraOriginY>
  <ClipList>
    <Clip id="0">
      <ClipName/>Clip Name 1<ClipPath/>/Users/perry/Desktop<ClipInFrame/>1<ClipOutFrame/>2<ClipFrameNumberPadding/>7
    </Clip>
    <Clip id="1">
      <ClipName/>Clip Name 2<ClipPath/>/Users/perry/Desktop<ClipInFrame/>3<ClipOutFrame/>4<ClipFrameNumberPadding/>7
    </Clip>
    <Clip id="2">
      <ClipName/>Clip Name 3<ClipPath/>/Users/perry/Desktop<ClipInFrame/>5<ClipOutFrame/>6<ClipFrameNumberPadding/>7
    </Clip>
    <Clip id="3">
      <ClipName/>Clip Name 4<ClipPath/>/Users/perry/Desktop<ClipInFrame/>7<ClipOutFrame/>8<ClipFrameNumberPadding/>7
    </Clip>
  </ClipList>
</Project>

Items inside <Project> such as <Name>, <Resolution>, and <ClipList> are all wrapped in opening and closing tags. eg: <ClipList> ... </Cliplist>

But the items inside of indvidual clips are not - they’re self-closing, and I’m not really clear on why these are treated differently, since the code for those was copy/pasted from the code above that handles the firstl-level children in <project>. I would like these to look like this:

<ClipList>
    <Clip id="0">
      <ClipName>Clip Name 1</ClipName>
      <ClipPath>/Users/perry/Desktop</ClipPath>
      <ClipInFrame>1</ClipInFrame>
      <ClipOutFrame>2</ClipOutFrame>
      <ClipFrameNumberPadding>7</ClipFrameNumberPadding>
    </Clip>
    <Clip id="1">
      <ClipName/>Clip Name 2</ClipName>
      <ClipPath/>/Users/perry/Desktop</ClipPath>
      <ClipInFrame/>3</ClipInFrame>
      <ClipOutFrame/>4</ClipOutFrame>
      <ClipFrameNumberPadding/>7</ClipFrameNumberPadding>
    </Clip>
    <Clip id="2">
      <ClipName>Clip Name 3</ClipName>
      <ClipPath>/Users/perry/Desktop</ClipPath>
      <ClipInFrame>5</ClipInFrame>
      <ClipOutFrame>6</ClipOutFrame>
      <ClipFrameNumberPadding>7</ClipFrameNumberPadding>
    </Clip>
    <Clip id="3">
      <ClipName>Clip Name 4</ClipName>
      <ClipPath>/Users/perry/Desktop</ClipPath>
      <ClipInFrame>7</ClipInFrame>
      <ClipOutFrame>8</ClipOutFrame>
      <ClipFrameNumberPadding>7</ClipFrameNumberPadding>
    </Clip>
  </ClipList>

Is there a way to force the element tags to wrap, rather than self-close?

You are repeating always the same error:

 ClipInfo.AppendChild(xml.CreateElement("ClipName"))
 ClipTextNode = xml.CreateTextNode(WMainWindow.lbClipList.CellTextAt(i,0))
 ClipInfo.AppendChild(ClipTextNode)
//should be
 ClipInfoNode=xml.CreateElement("ClipName") //new variable
 ClipInfo.AppendChild(ClipInfoNode)
 ClipTextNode = xml.CreateTextNode(WMainWindow.lbClipList.CellTextAt(i,0))
 ClipInfoNode.AppendChild(ClipTextNode)

IE you are adding info (nodes and textNodes to ClipInfo, but you want to add a node with text node to a the ClipInfo node

2 Likes

Of course. Thanks!