Jump to content
Sign in to follow this  

Using XMLDomWrapper.au3 to Get Attributes

Recommended Posts



I've been looking at XPath tutorials and trying to find Autoit example to solve a simple problem, I must be missing something here and would be grateful for help.


#include <_XMLDomWrapper.au3>


local $ids =_XMLGetAttrib('/r/line', "b")
ConsoleWrite(@LF & "=====" & $ids & "=====" & @LF)

;~ <r>
;~  <line a="1" b="2">hi</line>
;~  <line a="3" b="4">hey</line>
;~  <line a="5" b="6">hello</line>
;~ </r>

and console says: =====6=====

But I want to get all values for "b=" I want to get from the XML file 2,4,6

I tried the _XMLGetAllAttrib function but if that's the way to do it then I'm doing something wrong too. I've tested the XPath:  /r/line/@b  in Notepad++ XML Plugin and this XPath gives all the b values. If anyone could enlighten me I would appreciate it. Thanks. How do I get all the b values out of the XML?


Share this post

Link to post
Share on other sites


I know you are wanting to do this with XPATH (Maybe someone can help with this), I have tried with XMLDomWrapper and had no luck. But for the sake of a quick answer to your problem. You could try the below method, Returns an Array with Results.

#include <Array.au3>

$vXML = '<r>'
$vXML &=  '<line a="1" b="2">hi</line>'
$vXML &=  '<line a="3" b="4">hey</line>'
$vXML &=  '<line a="5" b="6">hello</line>'
$vXML &= '</r>'

$vRequest = StringRegExp($vXML, '<line\sa=".*?"\sb="(.*?)">.*?</line>', 3)


Also managed to get it working by declaring the XMLDOM Object

#include <Array.au3>

$vXML = '<r>'
$vXML &=  '<line a="1" b="2">hi</line>'
$vXML &=  '<line a="3" b="4">hey</line>'
$vXML &=  '<line a="5" b="6">hello</line>'
$vXML &= '</r>'

Local $vXPath = '//r/line'
Local $vAttrib = 'b'

$vXMLObj = ObjCreate('Microsoft.XMLDOM')
$vXMLBody = $vXMLObj.loadXML($vXML)
$vXMLNodeList = $vXMLObj.selectNodes($vXPath)
$vXMLNodeLength = $vXMLNodeList.length

Local $vArr[$vXMLNodeLength]

    For $i = 0 To $vXMLNodeList.length - 1
        $vGetAttrib = $vXMLNodeList.item($i).getAttribute($vAttrib)
        $vArr[$i] = $vGetAttrib


Edited by mrflibblehat

[font="'courier new', courier, monospace;"]Pastebin UDF | Prowl UDF[/font]

Share this post

Link to post
Share on other sites

awww, beat me to it...posting anyways to show collection loops (not storing in an array)

$sXML = '<r><line a="1" b="2">hi</line><line a="3" b="4">hey</line><line a="5" b="6">hello</line></r>'
$oXML = ObjCreate("Microsoft.XMLDOM")
$oAttribCol = $oXML.selectNodes( '//line/@b' )

For $oAttrib In $oAttribCol
    ConsoleWrite($oAttrib.value & @CRLF)

ConsoleWrite(@CRLF & "Take 2" & @CRLF)

$oNodeCol = $oXML.selectNodes( '//line' )
For $oNode In $oNodeCol
    ConsoleWrite($oNode.getAttribute("b") & @CRLF)

IEbyXPATH-Grab IE DOM objects by XPATH IEscriptRecord-Makings of an IE script recorder ExcelFromXML-Create Excel docs without excel installed GetAllWindowControls-Output all control data on a given window.

Share this post

Link to post
Share on other sites

I was looking for something like this - just put in the correct XPath and get the results. This "Microsoft.XMLDOM" solution worked like a charm. Thank you.

Share this post

Link to post
Share on other sites

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
Sign in to follow this  

  • Similar Content

    • macran
      By macran
      I want to generating a XML file (test.xml) like as follow:
      <?xml version="1.0" encoding="GBK"?>
      <!DOCTYPE SCHEMA SYSTEM "HGWSPZJK.dtd">  ;I can not generate this line
      <SCHEMA CRC="HGWSPZ201808_9131011571786229XM_CRC.XML" SSSQ="201808" CHSNAME="HGWSDKQD" NAME="HGWSPZ">

      <TAXPAYER CJRMC="sigmagroup" CJRDM="9131011571786229XM" CJLX="DKZK" RECORDCOUNT="411" SBRQ="2018-08-31" NSRMC="sigmagroup" SWSBH="9131011571786229XM">

      <Record BZ="" JKKADM="2244" JKKAMC="shanghai" SE="5907.82" TFRQ="2018-08-23" FPHM="224420181000752586-L02"/>
      <Record BZ="" JKKADM="2244" JKKAMC="shanghai" SE="4742.4" TFRQ="2018-08-21" FPHM="224420181000743016-L01"/>
      <Record BZ="" JKKADM="2244" JKKAMC="shanghai" SE="18720" TFRQ="2018-08-14" FPHM="224420181000719215-L01"/>
      I use XML.UDF  
      Local $oXMLile=_XML_CreateFile(@ScriptDir&"\test.xml","",True) 
      but there is no function CreateDocumentType 
      It is no effort even I test use 
      Local $doct=$oXMLfile.CreateDocumentType("SCHEMA", null, "HGWSPZJK.dtd", null)
      pls help me thanks.
    • Skeletor
      By Skeletor
      Hi All,
      This is purely an XML Language question. I need to understand how I can add a value/element in between another XML element. 
      Code below shows the XML file. The info tag has the elements already inserted.
      <Configuration xmlns="http://schemas.datacontract.org/2004/07/Modules.Reporting.DataContracts.LineItems" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <GenConf> <Info>ID, Site, Name , Site_ID</Info> </GenConf> </Configuration> Now, I want to add a value from a node group into this code. Something like below. But the example below does not work.
      Any suggestions?
      <Configuration xmlns="http://schemas.datacontract.org/2004/07/Modules.Reporting.DataContracts.LineItems" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <GenConf> <Info>ID, Site, a/@id, Name , Site_ID</Info> </GenConf> </Configuration> <ProductName> <a id="Windows Server"/> </ProductName>  
    • bhns
      By bhns
      try it for make flyers old games xml + Gdi, i belive many sources had lost 

    • CosminV
      By CosminV
      Hello guys,
      This XML things are driving me crazy...
      Please let me know how can I use the _XMLGetAttrib function... I've tried every possible way that I've read on the forum and I cannot succeed reading an attribute.
      The XML looks like bellow:
      <?xml version="1.0" encoding="UTF-8"?>
      <BATCH attr1= "aaa" attr2="bbb" attr3="ccc">
           <Node1 attr1="aaa" attr2="bbb" attr3="ccc" attr4="ddd" attr5="" attr6="eee" attr7="fff" attr8="ggg"/>
           <Node2 attr1="aaa" attr2="" attr3="" attr4="ddd"/>
           <Node3 attr1="" attr2="" attr3="ccc" attr4="" attr5="" attr6="eee"/>
           <Panel attr1="aaa" STATUS="BBB" attr3="ccc" attr4="ddd" attr5="" attr6="eee">
                <Node5 attr1="aaa" attr2="bbb" attr3="ccc" attr4="ddd" attr5="" attr6="eee" attr7="fff" attr8="ggg"/>
      I need to read the value of STATUS form the Panel node.
      Could you please help me?
      Best regards,
    • Subz
      By Subz
      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></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.
      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