1

this is a stripped down version of my XML file: simple.xml

<project>
 <scenes>
  <scene>
   <rootgroup>
    <nodelist>
     <module type="WRITE" name="Write_1080P">
      <option>
       <disabled val="true"/>
      </option>
     </module>
    </nodelist>
   </rootgroup>
  </scene>
 </scenes>
</project>

I need a vbscript find the correct "module" node by it's attribute name="Write_1080p" and then change the attribute "val" of his child node "disabled".

Should be quite simple, but I'm new to scripting in VB and am about to have a seizure.

1

1 Answer 1

1

This script:

  Dim oFS    : Set oFS  = CreateObject("Scripting.FileSystemObject")
  Dim sFSpec : sFSpec   = oFS.GetAbsolutePathName("..\testdata\xml\so11781815.xml")
  Dim oXML   : Set oXML = CreateObject("Msxml2.DOMDocument")
  oXML.setProperty "SelectionLanguage", "XPath"
  oXML.async = False
  oXML.load sFSpec
  If 0 = oXML.parseError Then
     WScript.Echo oXML.xml
     WScript.Echo "-----------------"
     Dim sXPath : sXPath    = "/project/scenes/scene/rootgroup/nodelist/module[@name=""Write_1080P""]/option/disabled"
     Dim ndFnd  : Set ndFnd = oXML.selectSingleNode(sXPath)
     If ndFnd Is Nothing Then
        WScript.Echo sXPath, "not found"
     Else
        WScript.Echo ndFnd.nodeName, ndFnd.getAttribute("val")
        WScript.Echo "-----------------"
        ndFnd.setAttribute "val", "disabled"
        WScript.Echo oXML.xml
     End If
  Else
     WScript.Echo oXML.parseError.reason
  End If

output:

<project>
        <scenes>
                <scene>
                        <rootgroup>
                                <nodelist>
                                        <module type="WRITE" name="Write_1080P">
                                                <option>
                                                        <disabled val="true"/>
                                                </option>
                                        </module>
                                </nodelist>
                        </rootgroup>
                </scene>
        </scenes>
</project>

-----------------
disabled true
-----------------
<project>
        <scenes>
                <scene>
                        <rootgroup>
                                <nodelist>
                                        <module type="WRITE" name="Write_1080P">
                                                <option>
                                                        <disabled val="disabled"/>
                                                </option>
                                        </module>
                                </nodelist>
                        </rootgroup>
                </scene>
        </scenes>
</project>

shows how to use .setProperty "SelectionLanguage", "XPath" to make sure that XPath queries are processed, how to query for an attribute value (..t/module[@name=""Write_1080P""]/opt..), and how to read (.getAttribute("val")) and write (.setAttribute "val", "disabled") an attribute.

P.S. Look here to see how you can look for/change text (with essentially the same code).

Sign up to request clarification or add additional context in comments.

1 Comment

Magical! Thanks Ekkehard. Just needed to to add 'oXML.Save "simple.xml" ' to write to the file.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.