Simpel

XML - double nodes

4 posts in this topic

#1 ·  Posted

Hi. I'm trying to write a xml. Here is my code:

#include <_XMLDomWrapper.au3>
#include <Date.au3>

Global $g_sXMLFileName
Global $g_sDestPath = @DesktopDir & "\"
Global $g_sReturnedBID = "A10829"

_makeXML()
_AddXML(1, "A10829_Thomas/wav/T001.wav")
_AddXML(2, "A10829_Thomas/wav/T002.wav")
Exit

Func _makeXML()
    Local $sXMLtime = StringReplace(StringReplace(StringReplace(_NowCalc()," ","_"),":","-"),"/","-") ; in yyyy-mm-dd_hh-mm-ss
    $g_sXMLFileName = $g_sDestPath & $g_sReturnedBID & "_" & "EB-Ton-Upload" & "_" & $sXMLtime & ".xml"
    _XMLCreateFile($g_sXMLFileName, "gemagvl", 1,1)
    _XMLFileOpen($g_sXMLFileName)
EndFunc

Func _AddXML($iCount, $sDateiname)
    _XMLCreateRootNodeWAttr("row", "count", $iCount, "")
    _XMLCreateChildNode("//row", "picklistenname", $g_sReturnedBID & "_EB-Ton-Upload")
    _XMLCreateChildNode("//row", "picklisteninfo")
    _XMLCreateChildNode("//row", "bid", $g_sReturnedBID)
    _XMLCreateChildNode("//row", "audiodateiname", $sDateiname)
    _XMLCreateChildNode("//row", "titel", StringTrimRight(StringTrimLeft($sDateiname, 7), 4))
    _XMLCreateChildNode("//row", "interpret", "EB")
    _XMLCreateChildNode("//row", "quelle", "Ton")
EndFunc

It returns:

<?xml version="1.0" encoding="UTF-8"?><gemagvl>
<row count="1">
<picklistenname>A10829_EB-Ton-Upload</picklistenname>
<picklisteninfo/>
<bid>A10829</bid>
<audiodateiname>A10829_Thomas/wav/T001.wav</audiodateiname>
<titel>Thomas/wav/T002</titel>
<interpret>EB</interpret>
<quelle>Ton</quelle>
<picklistenname>A10829_EB-Ton-Upload</picklistenname>
<picklisteninfo/>
<bid>A10829</bid>
<audiodateiname>A10829_Thomas/wav/T002.wav</audiodateiname>
<titel>Thomas/wav/T003</titel>
<interpret>EB</interpret>
<quelle>Ton</quelle>
</row>
<row count="2">
<picklistenname>A10829_EB-Ton-Upload</picklistenname>
<picklisteninfo/>
<bid>A10829</bid>
<audiodateiname>A10829_Thomas/wav/T002.wav</audiodateiname>
<titel>Thomas/wav/T003</titel>
<interpret>EB</interpret>
<quelle>Ton</quelle>
</row>
</gemagvl>

But it should return:

<?xml version="1.0" encoding="UTF-8"?><gemagvl>
<row count="1">
<picklistenname>A10829_EB-Ton-Upload</picklistenname>
<picklisteninfo/>
<bid>A10829</bid>
<audiodateiname>A10829_Thomas/wav/T001.wav</audiodateiname>
<titel>Thomas/wav/T002</titel>
<interpret>EB</interpret>
<quelle>Ton</quelle>
</row>
<row count="2">
<picklistenname>A10829_EB-Ton-Upload</picklistenname>
<picklisteninfo/>
<bid>A10829</bid>
<audiodateiname>A10829_Thomas/wav/T002.wav</audiodateiname>
<titel>Thomas/wav/T003</titel>
<interpret>EB</interpret>
<quelle>Ton</quelle>
</row>
</gemagvl>

The second inserted nodes are double. How will it be going right?

Regards, Conrad


SciTE = 3.6.2.0/full   AutoIt = 3.3.14.2   AutoItX64 = 0   OS = Win7Pro SP1   OSArch = X64   Language = 0407/german
H:\...\AutoIt3\SciTE   H:\...\AutoIt3   H:\...\AutoIt3\Include   H: = Network Drive

 

Share this post


Link to post
Share on other sites



#2 ·  Posted

You are adding the data into //row...which is every instance of a row node.  This works great when you have only one //row, but when you create the second node, you also re-add the data to the first...I'd just use the direct XML dom, myself:

.createElement

.appendChild

.text

.selectSingleNode


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

#3 ·  Posted

Meh, I was bored...example:

Local $oXML = ObjCreate("Microsoft.XMLDOM")
$oXML.loadxml("<gemagvl />")

$oRoot = $oXML.selectSingleNode("//gemagvl")

AddXML($oXML,$oRoot)
AddXML($oXML,$oRoot)
AddXML($oXML,$oRoot)
AddXML($oXML,$oRoot)
AddXML($oXML,$oRoot)
AddXML($oXML,$oRoot)

ConsoleWrite($oXML.xml & @CRLF)

Exit

Func AddXML($oXML,$o)
    Local $i = $o.selectNodes("./row").length + 1
    Local $oChild = $oXML.createElement("row")
    $oChild.SetAttribute("count",$i)

    Local $oChild_1 = $oXML.createElement("blah")
    Local $oChild_2 = $oXML.createElement("blah2")
    Local $oChild_3 = $oXML.createElement("blah3")
    Local $oChild_4 = $oXML.createElement("blah4")
    $oChild_1.text = $i & 1
    $oChild_2.text = $i & 2
    $oChild_3.text = $i & 3
    $oChild_4.text = $i & 4
    $oChild.appendChild($oChild_1)
    $oChild.appendChild($oChild_2)
    $oChild.appendChild($oChild_3)
    $oChild.appendChild($oChild_4)

    $o.appendChild($oChild)
EndFunc

 


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

#4 ·  Posted

Thank you for the example. I did this hours after I wrote my first post:

_CreateXML()
Local $iCounter = 1
For $i = 1 To 10
    _AddXML($iCounter, "Test-Dateiname_" & $i)
    $iCounter +=1
Next
_CloseXML()
Exit

Func _CreateXML()
    Local $sXMLtime = StringReplace(StringReplace(StringReplace(_NowCalc()," ","_"),":","-"),"/","-") ; in yyyy-mm-dd_hh-mm-ss
    $g_sXMLFileName = $g_sDestPath & $g_sReturnedBID & "_" & "EB-Ton-Upload" & "_" & $sXMLtime & ".xml"
    $g_sXMLFileHandle = FileOpen($g_sXMLFileName, 1)
    Local $sXMLHeader = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'
    Local $sXMLRootOpen = '<gemagvl xmlns="http://www.xyz.de/vbai/schema/gemagvl">'
    FileWrite($g_sXMLFileHandle, $sXMLHeader)
    FileWrite($g_sXMLFileHandle, $sXMLRootOpen)
EndFunc

Func _AddXML($iCount, $sDateiname)
    Local $sXMLRowOpen = '<row count="' & $iCount & '">'
    Local $sXMLInterpret = '<interpret>EB</interpret>'
    Local $sXMLTitel = '<titel>' & StringTrimRight(StringTrimLeft($sDateiname, 7), 4) &'</titel>'
    Local $sXMLBID = '<bid>' & $g_sReturnedBID & '</bid>'
    Local $sXMLAudiodateiname = '<audiodateiname>' & $sDateiname & '</audiodateiname>'
    Local $sXMLQuelle = '<quelle>Ton</quelle>'
    Local $sXMLPicklisteninfo = '<picklisteninfo></picklisteninfo>'
    Local $sXMLPicklistenname = '<picklistenname>EB-Ton-Upload</picklistenname>'
    Local $sXMLPicklistenzaehler = '<picklistenzaehler>' & $iCount & '</picklistenzaehler>'
    Local $sXMLRowClose = '</row>'
    FileWrite($g_sXMLFileHandle, $sXMLRowOpen)
    FileWrite($g_sXMLFileHandle, $sXMLInterpret)
    FileWrite($g_sXMLFileHandle, $sXMLTitel)
    FileWrite($g_sXMLFileHandle, $sXMLBID)
    FileWrite($g_sXMLFileHandle, $sXMLAudiodateiname)
    FileWrite($g_sXMLFileHandle, $sXMLQuelle)
    FileWrite($g_sXMLFileHandle, $sXMLPicklisteninfo)
    FileWrite($g_sXMLFileHandle, $sXMLPicklistenname)
    FileWrite($g_sXMLFileHandle, $sXMLPicklistenzaehler)
    FileWrite($g_sXMLFileHandle, $sXMLRowClose)
EndFunc

Func _CloseXML()
    Local $sXMLRootClose = '</gemagvl>'
    FileWrite($g_sXMLFileHandle, $sXMLRootClose)
    FileClose($g_sXMLFileHandle)
EndFunc

Is there a problem when I create my XML with "FileWrite"? Will it need more time to create?

Regards, Conrad


SciTE = 3.6.2.0/full   AutoIt = 3.3.14.2   AutoItX64 = 0   OS = Win7Pro SP1   OSArch = X64   Language = 0407/german
H:\...\AutoIt3\SciTE   H:\...\AutoIt3   H:\...\AutoIt3\Include   H: = Network Drive

 

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

  • Similar Content

    • rootx
      By rootx
      I need help to read in a loop the DVD id child and subchild. Thx
      Example...
      DVD001 - PAL - EN,FR,DE,ES,IT and filter the right title & descri language.  I tried with $oXML.SelectSingleNode but without success
      <?xml version="1.0" encoding="UTF-8"?> <datafile xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mydvd.xsd"> <dvd name="My dvd title"> <id>DVD001</id> <region>PAL</region> <languages>EN,FR,DE,ES,IT</languages> <locale lang="EN"> <title>title en</title> <descri>descri en</descri> </locale> <locale lang="FR"> <title>title fr</title> <descri>descri fr </descri> </locale> <locale lang="DE"> <title>title de</title> <descri>descri de </descri> </locale> <locale lang="ES"> <title>title es</title> <descri>descri es</descri> </locale> <locale lang="IT"> <title>title it</title> <descri>descri it</descri> </locale> </dvd> <dvd name="My dvd title 2"> <id>DVD002</id> <region>USA</region> <languages>EN</languages> <locale lang="EN"> <title>title en</title> <descri>descri en</descri> </locale> </dvd> </datafile> #include <File.au3> $xml = @ScriptDir&"\test.xml" Local $oXML = ObjCreate("Microsoft.XMLDOM") $oXML.load($xml) $id = $oXML.SelectNodes("//dvd") For $ids In $id ConsoleWrite($ids.text &@CRLF) Next  
    • mLipok
      By mLipok
      I was asking @eltorro serveral times for any support  for XML DOM wrapper (COM) - with no success  
          So I took matters into my hands ..... I want to present XMLWrapperEx.au3 - BETA Version
      Want to join to the project ?
       
      Here is some description:
      ; #INDEX# ======================================================================================================================= ; Title .........: XMLWrapperEx.au3 ; AutoIt Version : 3.3.10.2++ ; Language ......: English ; Description ...: Functions to use for reading and writing XML using msxml. ; Remarks .......: BETA Version ; Author ........: mLipok ; Version .......: "1.1.1.01" ; _XML_MiscProperty_UDFVersion() #CS This UDF is created on the basis of: https://www.autoitscript.com/forum/topic/19848-xml-dom-wrapper-com/ For this reason, I attach also the last known (to me) previous version ($_XMLUDFVER = "1.0.3.98" _XMLDomWrapper_1.0.3.98_CN.au3 ) For the same reason I continue to recognize the achievements of the work of my predecessors (they are still noted in each Function header). . . . . !!!!!!!!! This is BETA VERSION (all could be changed) !!!!!!!!! . . . WORK IN PROGRES INFORMATION: For now 2015-09-01 the descripion (Function Header) can not entirely correctly describe the function. TODO: in many places I used "TODO" as a keyword to find what should be done in future . I want to: PREVENT THIS: The unfortunate nature of both the scripts is that the func return results are strings or arrays instead of objects. .     I want to: USE THIS CONCEPT:     .   All function should use Refernce to the object as first Function parameter     .   All function should return in most cases objects. There should be separate functions to Change Object collection to array     .   All function should use COM Error Handler in local scope.     .   All function should return @error which are defined in #Region XMLWrapperEx.au3 - @ERROR Enums     .    All function should have the same naming convention     .    All variables should have the same naming convention     .    There should not to be any Global Variable - exception is $g__oXMLDOM_Events     .   It should be possible easy to use XML DOM Events     .        https://msdn.microsoft.com/en-us/library/ms764697(v=vs.85).aspx     .   It should be possible easy to Debug     .    Ultimately, you should be able to do anything with your XML without having to use your own Error Handler. #CE  
      More info inside zip archive.
      This UDF can be downloaded from here:
      REMARK:
      This UDF was formerly named:   XMLWrapperEx.au3 
       
    • 31290
      By 31290
      Hi Guys, 
      Since I'm able to get a Dell equipment warranty status thanks to my API key, I'm using an UDF to extract data from an XML file and get the end date. > 
      Thing is, when using InetGet, the original file is in JSON format and the UDF is not working anymore, even if I download the file with the xml extension. Therefore, and when I manually download the page with Chrome, I have a proper XML file where the UDF is working fine.
      Here's my code:
      I even tried to convert the json to xml > https://www.autoitscript.com/forum/topic/185717-js-json-to-xml/
      I took a look here https://www.autoitscript.com/forum/topic/104150-json-udf-library-fully-rfc4627-compliant/ but I don't understand anything :/
       
      The XML read UDF is just perfect for my needs but I'm stuck here... 
      Thanks for any help you can provide
      -31290-
      3MTXM12.json
      3MTXM12.xml
    • Zaroz
      By Zaroz
      Alright, this is going to be a rather long explanation so bear with me.
      What I am trying to to is build a GUI program that, in the end, will look like this:
      The middle Frame is for displaying a desktop icon and the right frame is for displaying a selected image.
      The XML file I am using looks like this:
      <list> <item id="1"> <ico>Path\to\icon1<\ico> <img>Path\to\image1<\img> <exe>Path\to\program1<\exe> <label>UserDefinedLabel1<\label> <\item> <item id="2"> <ico>Path\to\icon2<\ico> <img>Path\to\image2<\img> <exe>Path\to\program2<\exe> <label>UserDefinedLabel2<\label> <\item> <\list> What I want this program to do is when I highlight an item in the listbox (which btw is displaying the <label> value associated with the item) I want the displayed icon and image to change to the ones associated with that entry. 
      Also I would like to include an additional dialog to open when the 'ADD' button is clicked that will add entries to the XML file that looks like this:

       
      The main problem I am running into is that I do not know much about XML and how to parse it into dynamic variables that can change based off of selection.
      Any help is appreciated.
       
       
       
      10-29-16 EDIT: For all intents and purposes, I basically want to create something similar to PStart, but with a preview pane with a customizable image for each item in it.
    • ur
      By ur
      Any internal xml API to parse and edit XML files in AutoIT?