Jump to content

Recommended Posts

Posted (edited)

Can anyone assist with creating/modify/delete XML Nodes/Child Nodes?

Have a document for example:

<ConfigData>
    <parameter>
        <name>Setting One</name>
        <value>10</value>
    </parameter>
    <parameter>
        <name>IPAddress</name>
        <value>192.168.1.1</value>
    </parameter>
    <parameter>
        <name>Setting One</name>
        <value>200</value>
    </parameter>
    <parameter>
        <name>Setting Three</name>
        <value>300</value>
    </parameter>
</ConfigData>

Would like to add another node parameter/name, parameter/value, but unsure how to, when there are multiple instances with the same tagname for example, would like to add the following if the nodes do not already exist:

<parameter>
    <name>UserPreferredLanguage</name>
    <value>English</value>
</parameter>

Currently using the following to check and delete/modify existing nodes, was thinking of placing the name and value into a 2d array and then using a true/false in a 3rd column to return if the setting was found and modified or not, so I can decide whether I need to create the nodes or not, but I'm hoping there is a simpler way.\

Any assistance would be much appreciated.

PS: Have also written this with the XML Dom Wrapper UDF but still unsure how to proceed with checking nodes and creating them if they're missing, also couldn't find a function to delete a full node + parent using selectNodes, hence the custom __XML_DeleteNode function.

Thanks

Local $sXMLDocPath = @ScriptDir & "\XMLDoc.xml"
Local $oXMLDoc = ObjCreate("MSXML2.DOMDocument")
    $oXMLDoc.validateOnParse = False
    $oXMLDoc.load($sXMLDocPath)
Local $oXMLNodes = $oXMLDoc.selectNodes("ConfigData/parameter")
If IsObj($oXMLNodes) Then
    For $oXMLNode In $oXMLNodes
        If $oXMLNode.childNodes.item(0).tagName  = "Name" And $oXMLNode.childNodes.item(0).Text = "Setting One" Then
            If $oXMLNode.childNodes.item(1).tagName = "Value" Then $oXMLNode.childNodes.item(1).Text = 10
        EndIf
        If $oXMLNode.childNodes.item(0).tagName  = "Name" And $oXMLNode.childNodes.item(0).Text = "IPAddress" Then
            __XML_DeleteNode($oXMLNode)
        EndIf
        If $oXMLNode.childNodes.item(0).tagName  = "Name" And $oXMLNode.childNodes.item(0).Text = "Setting Two" Then
            If $oXMLNode.childNodes.item(1).tagName = "Value" Then $oXMLNode.childNodes.item(1).Text = 20
        EndIf
        If $oXMLNode.childNodes.item(0).tagName  = "Name" And $oXMLNode.childNodes.item(0).Text = "Setting Three" Then
            If $oXMLNode.childNodes.item(1).tagName = "Value" Then $oXMLNode.childNodes.item(1).Text = 30
        EndIf
    Next
EndIf

$oXMLDoc.Save ($sXMLDocPath)

Func __XML_DeleteNode($_oNode_Enum)
    If $_oNode_Enum.hasChildNodes Then
        For $_oNode_Enum_Child In $_oNode_Enum.childNodes
            If $_oNode_Enum_Child.nodeType = $XML_NODE_TEXT Then
                If StringStripWS($_oNode_Enum_Child.text, $STR_STRIPLEADING + $STR_STRIPTRAILING + $STR_STRIPSPACES) = "" Then
                    $_oNode_Enum.removeChild($_oNode_Enum_Child)
                EndIf
            EndIf
        Next
    EndIf
    $_oNode_Enum.parentNode.removeChild($_oNode_Enum)
EndFunc

 

Edited by Subz
Posted

Thanks Danp2, yes have the latest XML.au3 and have used it with other projects, however in those situations I had an id attribute to identify each node, however in this current project they have no identifiers except for the innerText of the "name" tag, but not sure how I get the "value" tag or create a new parameter/name and parameter/version nodes.  Hope that made sense.

Posted (edited)

Do you still need help with this , or you already solve it ?

 

Edited by mLipok

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

  Reveal hidden contents

Signature last update: 2023-04-24

Posted

@mLipok After reading a lot of msdn and snippets I have got it working although, not sure if its the best way.

This is part of project to automate Avaya (VOIP) Client settings for each user that logs on.  First I created an Array with all audio devices, the id, guid and name.  Then to create the parameter node and sub-nodes I used the following.  I know you're a guru on xml, do you think below is the best approach?  Or is there an easier way?  Always happy to learn something new.

$oRoot_Node = $oXMLDoc.documentElement
    $oParameter = $oXMLDoc.createNode(1, "parameter", "http://xml.avaya.com/endpointAPI")
        $oRoot_Node.appendChild($oParameter)
    $oName = $oXMLDoc.createNode(1, "name", "http://xml.avaya.com/endpointAPI")
        $oName.Text = "AudioDeviceList"
        $oParameter.appendChild($oName)
    $oValue = $oXMLDoc.createNode(1, "value", "http://xml.avaya.com/endpointAPI")
        $oParameter.appendChild($oValue)
    $oAudioDeviceList = $oXMLDoc.createNode(1, "AudioDeviceList", "http://xml.avaya.com/endpointAPI")
        $oValue.appendChild($oAudioDeviceList)
    $oRingViaSecondDevice = $oXMLDoc.createNode(1, "RingViaSecondDevice", "http://xml.avaya.com/endpointAPI")
        $oRingViaSecondDevice.Text = "true"
        $oAudioDeviceList.appendChild($oRingViaSecondDevice)
    $oRingingDeviceEnabled = $oXMLDoc.createNode(1, "RingingDeviceEnabled", "http://xml.avaya.com/endpointAPI")
        $oRingingDeviceEnabled.Text = "true"
        $oAudioDeviceList.appendChild($oRingingDeviceEnabled)
    $oPlayback = $oXMLDoc.createNode(1, "playback", "http://xml.avaya.com/endpointAPI")
        $oAudioDeviceList.appendChild($oPlayback)

    $sState = "true"
    For $i = 0 To UBound($aPlayback) - 1
        $oDevice = $oXMLDoc.createNode(1, "device", "http://xml.avaya.com/endpointAPI")
            $oPlayback.appendChild($oDevice)
        $oGuid = $oXMLDoc.createNode(1, "guid", "http://xml.avaya.com/endpointAPI")
            $oGuid.Text = $aPlayback[$i][2]
            $oDevice.appendChild($oGuid)
        $oName = $oXMLDoc.createNode(1, "name", "http://xml.avaya.com/endpointAPI")
            $oName.Text = $aPlayback[$i][3]
            $oDevice.appendChild($oName)
        $oVolume = $oXMLDoc.createNode(1, "volume", "http://xml.avaya.com/endpointAPI")
            $oVolume.Text = "50"
            $oDevice.appendChild($oVolume)
        $oState = $oXMLDoc.createNode(1, "state", "http://xml.avaya.com/endpointAPI")
            $oState.Text = $sState
            $oDevice.appendChild($oState)
        $oAvailable = $oXMLDoc.createNode(1, "available", "http://xml.avaya.com/endpointAPI")
            $oAvailable.Text = "true"
            $oDevice.appendChild($oAvailable)
        $sState = "false"
    Next

 

Posted
  On 4/10/2018 at 9:18 AM, Subz said:

 ... I know you're a guru on xml ...

Expand  

:> I'm not sure you are realy thought about me ...

btw. after a quick review, I think your aproach is good as far this is working, as so far I can only sugest to you to try this clonNode method:

https://msdn.microsoft.com/en-us/library/ms762269(v=vs.85).aspx

 

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

  Reveal hidden contents

Signature last update: 2023-04-24

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...