Marlon
Marlon

Reputation: 3

Create new XML Element as a Parent Node of Existing Element

I would like to create a new XML element to make my existing XML node as a child node of this new element. The structure of my current XML file is:

<?xml version="1.0" encoding="utf-8"?>
<component>
<type name="A"></type>
<type name="B"></type>
</component>

My idea is to create new element "masterType" and make it as a parent node of existing "type" element.

<?xml version="1.0" encoding="utf-8"?>    
<component>
<masterType>
<type name="A"></type>
<type name="B"></type>
</masterType>
</component>

My question is, how can I make this new element as a parent node of my existing xml node? What happens if I used insertBefore(), the "masterType" already ends before the element "type".

<?xml version="1.0" encoding="utf-8"?>
<component>
<masterType>
</masterType>
<type name="A"></type>
<type name="B"></type>
</component>

Here's my code

Dim fileName As String
fileName = ActiveSheet.OLEObjects("TextBox1").Object.Text
XMLFileName = fileName
Dim Found As Boolean
Dim docXMLDOM As DOMDocument
Dim nodeType As IXMLDOMNodeList
Dim nodElement As IXMLDOMElement
Dim nodNewElement As IXMLDOMElement
Dim nodReference As IXMLDOMElement
Set docXMLDOM = New DOMDocument
docXMLDOM.Load XMLFileName
Set nodeType = docXMLDOM.getElementsByTagName("type")

For Each nodElement In nodeType
If nodElement.Attributes.getNamedItem("name").Text = "A" Then
Set nodReference = nodElement
Set nodNewElement = docXMLDOM.createElement("masterType")
nodElement.ParentNode.InsertBefore nodNewElement, nodElement
Exit For
End If
Next

docXMLDOM.Save XMLFileName

Upvotes: 0

Views: 517

Answers (1)

Tim Williams
Tim Williams

Reputation: 166316

Simplified example:

Sub AddParentNode()

    Dim docXMLDOM As MSXML2.DOMDocument60
    Dim els As IXMLDOMNodeList
    Dim masterEl As IXMLDOMElement
    Dim el As IXMLDOMElement

    Set docXMLDOM = New MSXML2.DOMDocument60
    docXMLDOM.LoadXML Range("A1").Value 'for testing
    Debug.Print "*** Before ***"
    Debug.Print docXMLDOM.XML

    Set els = docXMLDOM.getElementsByTagName("type")
    If els.Length > 0 Then
        'create the new parent element
        Set masterEl = docXMLDOM.createElement("masterType")
        els(1).ParentNode.appendChild masterEl
    End If

    'append each "type" element into the new parent node
    For Each el In els
        masterEl.appendChild el.CloneNode(True)
        el.ParentNode.RemoveChild el
    Next
    Debug.Print "*** After ***"
    Debug.Print docXMLDOM.XML

End Sub

Upvotes: 0

Related Questions