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?