Jump to content
Sign in to follow this  
gillesg

[Solved] Xml Parsing - with XMLDOM

Recommended Posts

gillesg

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

Share this post


Link to post
Share on other sites
jdelaney

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.

Share this post


Link to post
Share on other sites
gillesg

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

Share this post


Link to post
Share on other sites
gillesg

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

Share this post


Link to post
Share on other sites
jonpoeschek

Hi gillesg,

Were you able to get this working? I'm also looking for a way to set the Itunes xml file location.

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

    • ijourneaux
      By ijourneaux
      I am trying to read an XML file that looks like the following. I am particularly interested in the ParameterNames and ParameterValues
       
      I was able to read a simplier XML file using
      $oXML.load("DataForwardSettings.xml") Local $oInfos = $oXML.selectnodes("//Database") ; or //Info or //Data//Info or //Values/Info  but have not been able to read
      <?xml version="1.0"?> <Entities> <Entity RecordType="TrendData"> <Property Name="AlarmLimitsSetNumber" IsReadOnly="False" ValueType="System.Int32">8</Property> <Property Name="AnalysisParamaterSetNumber" IsReadOnly="False" ValueType="System.Int32">8</Property> <Property Name="ParameterNames" IsReadOnly="True" IsList="True" ListType="List<string>" ValueType="Array" ArrayType="System.String" Count="12">System.Collections.Generic.List`1[System.String]<Data>OVERALL|PK-PK WAVEFORM|HFD|CREST FACTOR|SYNC 1-6|1X|2X|3X-4X|FTF|BSF|BPFO|BPFI</Data></Property> <Property Name="ParameterValues" IsReadOnly="True" IsList="True" ListType="List<float>" ValueType="Array" ArrayType="System.Single" Count="12">System.Collections.Generic.List`1[System.Single]<Data>0.04706,0.27951,0.02640,4.85608,0.03494,0.01727,0.02256,0.01993,0.00207,0.00060,0.00178,0.00221</Data></Property> <Property Name="NumberOfParameters" IsReadOnly="False" ValueType="System.Int32">12</Property> <Property Name="ModifiedSinceLastDataDump" IsReadOnly="False" ValueType="System.Boolean">False</Property> <Property Name="Load" IsReadOnly="False" ValueType="System.Single">0</Property> <Property Name="RPM" IsReadOnly="False" ValueType="System.Single">140.962</Property> <Property Name="Value" IsReadOnly="False" ValueType="System.Single">-1.1E-20</Property> <Property Name="SampleID" IsReadOnly="False" ValueType="System.Int32">-626794</Property> <Property Name="Timestamp_as_String" IsReadOnly="True" ValueType="System.String">8/18/2018 2:05:33 PM</Property> <Property Name="Timestamp_as_UInt" IsReadOnly="False" ValueType="System.UInt32">1534619133</Property> <Property Name="Timestamp" IsReadOnly="False" ValueType="System.DateTime">8/18/2018 2:05:33 PM</Property> <Property Name="StorageFlag" IsReadOnly="False" ValueType="Enum" EnumType="Emerson.CSI.DataImport.MHM.TrendDataStorageType" EnumValue="2">RPM_And_Overall</Property> <Property Name="Parents" IsReadOnly="False" IsList="True" ListType="List<string>" ValueType="Array" ArrayType="System.String" Count="5">System.Collections.Generic.List`1[System.String]<Data>Database=phmhmdb4ts;C:\RBMdbsrv\CustData\4ts_online_1807.rbm;-99|Area=4TS;-494|Equipment=4THTS;-712|MeasurementPoint=D39;-780|DataCollectionSet=Normal Collection Dryer Rolls;-783</Data></Property> </Entity> </Entities> I tried switching to the XML UDF but was alittle lost in how to use it. I am particularly interested in the ParameterNames and ParameterValues.
    • 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">

      <Records>
      <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"/>
      </Records>
      </TAXPAYER>
      </SCHEMA>
      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)
            $oXmlfile.appendChild($doct)
      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 
      AIT-ADRLIST.au3

    • 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"/>
                .............................................................................................................................................................................
           </Panel>
      </Batch>
       
      I need to read the value of STATUS form the Panel node.
       
      Could you please help me?
       
      Best regards,
      Cococnb
×