gillesg Posted September 5, 2012 Posted September 5, 2012 (edited) 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.expandcollapse popup#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 ;==>_RetFirstI 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 September 5, 2012 by gillesg
jdelaney Posted September 5, 2012 Posted September 5, 2012 (edited) 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 September 5, 2012 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.
gillesg Posted September 5, 2012 Author Posted September 5, 2012 Please provide the XPath, or a snippet of the XML....Hi,Thanks for the fast response. The XML file that I try to parse is attached to the first post.I will dig into your sample to see it if i am able to work it out.Regards,Gilles
gillesg Posted September 5, 2012 Author Posted September 5, 2012 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#introDetailled XPATH-2 possibilitieshttp://www.zvon.org/xxl/XPathTutorial/General/examples.htmlXPATH-1 tutorialhttp://stackoverflow.com/questions/1198253/xpath-how-to-select-elements-based-on-their-valueSome answers from the webAnd 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 ExitThe magic lies here :$XmlRootPath = '//plist/dict/dict/key[starts-with(text(),"iTunes Library XML Location")]/following::data[position()=1]'Regards,Gilles
jonpoeschek Posted February 23, 2013 Posted February 23, 2013 Hi gillesg, Were you able to get this working? I'm also looking for a way to set the Itunes xml file location.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now