Jump to content

[Solved] Xml Parsing - with XMLDOM


gillesg
 Share

Recommended Posts

Hi All,

I Am trying to update field in a xml file ("iTunesPrefs.xml" see attach)

To do so, I try to use XMLDOM (link : )

So far I am unsuccesfull.

Here is the code I came up to, and I am stuck.

#Include <File.au3>
#Include <Array.au3>
#include "_XMLDomWrapper.au3"

$DirInput =@TempDir
$FileInput = "iTunesPrefs.xml"

$sXmlFile =$DirInput & "\" & $FileInput
$iOXml = _XMLFileOpen($sXmlFile)
$XmlRootPath = "//plist/dict"

Local $i_Nodes = _XMLGetNodeCount ( $XmlRootPath)
msgbox(0,"","nb node = " & $i_Nodes)
If $i_Nodes > 0 Then
Local $sRet = _XMLGetChildNodes ( $XmlRootPath)
$i_nodes=$sRet[0]
msgbox(0,"","nb node = " & $i_Nodes)

Local $nodeIndex, $key[$i_Nodes], $value[$i_nodes], $z
If IsArray($sRet) Then
_ArrayDisplay($sRet,"Node Names with _XMLGetChildNodes")
$aArr = _XMLGetField ($XmlRootPath)
_arraydisplay($aArr)
For $nodeIndex = 1 To $sRet[0]
$key[$nodeIndex - 1] = _RetFirst(_XMLGetField ($XmlRootPath & "[" & $nodeIndex & "]"))
$value[$nodeIndex - 1] = "<" &$sRet[$nodeIndex] & ">" & _RetFirst(_XMLGetField ($XmlRootPath & "[" & $nodeIndex & "]"))
Next
_ArrayDisplay($key, "Key")
_ArrayDisplay($Value, "Value")
EndIf
EndIf
Exit

;===============================================================================
;Funcs
;===============================================================================
Func _RetFirst($aArray); return first item in an array
If IsArray($aArray) Then
if $aArray[0] >=1 then
Return $aArray[1]
Else
Return $aArray[0]
EndIf
EndIf
EndFunc ;==>_RetFirst

I want to navigate thru each XML node and manipulate its Xml Tag Name and value.

Especialy I want to update the Value of the Data field after the "<key>iTunes Library XML Location:1</key>"

Can anyone give me some hints or advices ? I am lost.

Regards.

iTunesPrefs.xml

Edited by gillesg
Link to comment
Share on other sites

Please provide the XPath, or a snippet of the XML.

$oXML=ObjCreate("Microsoft.XMLDOM")
;$stest = @DesktopDir & "xml1.xml"
$oXML.LoadXML('<td class="questionTitle"><a href="testing an attribute.html" class="asdf" >asdf</a></td>') ; load text of the DOM object
;$oXML.load($stest) ; load file of xml
ConsoleWrite ( $oXML.xml & @CRLF)
$result1 = $oXML.selectSingleNode('//a')
$result1.text = "whatever you want it to be"
ConsoleWrite ( $oXML.xml & @CRLF)

this will change the value of the //a node/

One more sample, to loop through nodes:

$result = $oXML.selectNodes( '//items/item[@name="test"]/type[contains(@title,"value")]' )
For $Node In $result
 If $node.text = "whatever your condition is" Then
  $node.text = "whatever value you need"
 EndIf
Next
Edited by jdelaney
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.
Link to comment
Share on other sites

Hi,

After digging into the proposition, I realized that my problem was not knowing what "XPATH" was.

I used the following ressources to get a basic understanding and fix what I needed :

http://www.zvon.org/comp/r/ref-XPath_2.html#intro

Detailled XPATH-2 possibilities

http://www.zvon.org/xxl/XPathTutorial/General/examples.html

XPATH-1 tutorial

http://stackoverflow.com/questions/1198253/xpath-how-to-select-elements-based-on-their-value

Some answers from the web

And finally my code now looks like :

; Script Start - Add your code below here
#Include
#Include
#include "Base64.au3"
#include "_XMLDomWrapper.au3"

$DirInput = "C:\Users\ggros\Personnel\Réflexion codage"
$FileInput = "iTunesPrefs.xml"

$sXmlFile =$DirInput & "\" & $FileInput
$iOXml = _XMLFileOpen($sXmlFile)

$XmlRootPath = '//plist/dict/dict/key[starts-with(text(),"iTunes Library XML Location")]/following::data[position()=1]'

;iTunes Library XML Location
Local $i_Nodes = _XMLGetNodeCount ( $XmlRootPath)
If $i_Nodes = 1 Then
$aArrayValue = _XMLGetValue($XmlRootPath)
_arraydisplay($aArrayValue,"_XMLGetValue")

_XMLUpdateField($XmlRootPath,"The New data that need to be set ")
$abArr = _XMLGetValue($XmlRootPath)
_arraydisplay($abArr,"_XMLGetValue")
EndIf
Exit

The magic lies here :

$XmlRootPath = '//plist/dict/dict/key[starts-with(text(),"iTunes Library XML Location")]/following::data[position()=1]'

Regards,

Gilles

Link to comment
Share on other sites

  • 5 months later...

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
 Share

×
×
  • Create New...