Jump to content
Sign in to follow this  
amakrkr

xml - problem

Recommended Posts

amakrkr

hello,

i am using _xmldomwrapper and i have encountered a problem with my xml:

xml is:

<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:edp="http://mydocs/Documents/Schemas/EDP-Common-1.xsd" xmlns="http://mydocs/Documents/Schemas/schema_8.xsd">
<table>
<att08>
</table>
</att08>

Now i want to insert child node to /envelope/table/att08

Now here is the poblem if i use code like this:

#include<_XMLDomWrapper.au3>

$origin_xml = @ScriptDir & "\" & "tax_2013.xml"

$xml_open_origin = _XMLFileOpen($origin_xml,'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:edp="http://mydocs/Documents/Schemas/EDP-Common-1.xsd" xmlns="http://mydocs/Documents/Schemas/DOD_DDPO_8.xsd"')

_XMLCreateChildNode("/Envelope/body/DOD_DDPO/Att08","TableA")

Node is not inserted because no node is selected ... xpath is wrong right?

Now with this code it "works" node gets selected and child is inserted:

#include<_XMLDomWrapper.au3>

$origin_xml = @ScriptDir & "\" & "tax_2013.xml"

$xml_open_origin = _XMLFileOpen($origin_xml,'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:edp="http://mydocs/Documents/Schemas/EDP-Common-1.xsd" xmlns:test="http://mydocs/Documents/Schemas/DOD_DDPO_8.xsd"')

_XMLCreateChildNode("/test:Envelope/test:body/test:DOD_DDPO/test:Att08","TableA")

But its inserted with attribute:

<TableA xmlns=""/>

Output should be:

<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:edp="http://mydocs/Documents/Schemas/EDP-Common-1.xsd" xmlns="http://mydocs/Documents/Schemas/schema_8.xsd">
<table>
<att08>
</TableA>
</table>
</att08>

can someone exqaplin to me whats wrong with my code?

Edited by amakrkr

Share this post


Link to post
Share on other sites
amakrkr

#include-once
;;There is also _MSXML.au3 at http://code.google.com/p/my-autoit/source/browse/#svn/trunk/Scripts/MSXML
;; http://my-autoit.googlecode.com/files/_MSXML.au3
;;which return the xml object instead of using a global var.
;;Therefore using the one above, more than one xml file can be opened at a time.

;;The unfortunate nature of both the scripts is that the func return results are strings or arrys instead of objects.


; #INDEX# =======================================================================================================================
; Title .........: _XMLDomWrapper
; AutoIt Version : 3.2.3++
; Language ......: English
; Description ...: Functions to use for reading and writing XML using msxml.
; .Initial release Dec. 15, 2005
; .Dec 15, 2005, Update Jan10,2006, Update Feb 5,8,14-15, 2006
; .Feb 24, 2006 Updated _XMLCreateCDATA, code cleaned up Gary Frost (custompcs@charter.net)
; .Feb 24, 2006 bug fix in re-init COM error handler, rewrote _XMLCreateChildNodeWAttr()
; .Jun 20, 2006 Added count to index[0] of the _XMLGetValue return value
; .Jun 26, 2006 Changed _XMLCreateFile to include option flag for UTF-8 encoding
; .Jun 29, 2006 Added count to index[0] of the _XMLGetValue return
; . Changed _XMLFileOpen and _XMLFileCreate
; .Mar 30, 2007 Rewrote _AddFormat function to break up tags( no indentation)
; .Added _XMLTransform() which runs the document against a xsl(t) style sheet for indentation.
; . Changed _XMLCreateRootChildWAttr() to use new formatting
; . Changed _XMLChreateChildNode() to use new formatting
; .Apr 02, 2007 Added _XMLReplaceChild()
; .Apr 03, 2007 Changed other node creating function to use new formatting
; . Changed _XMLFileOpen() _XMLFileCreate to take an optional version number of MSXML to use.
; . Changed _XMLFileOpen() _XMLFileCreate find latest MSXML version logic.
; .Apr 24, 2007 Fixed _XMLCreateChileNodeWAttr() - Instead of removal, It points to the function that replaced it.
; .Apr 25, 2007 Added _XMLCreateAttrib()
; . Fixed bug with _XMLCreateRootNodeWAttr , _XMLCreateChild[Node]WAttr() where an extra node with same name was added.
; . Stripped extrenous comments.
; . Removed dependency on Array.au3 (I added the func from Array.au3 and renamed it to avoid conflicts.)
; .May 03, 2007 Changed method of msxml version lookup. Updated api call tips.
; .May 11, 2007 Fixed missing \
; .Jun 08, 2007 Fixed Namespace issue with _XMLCreateChildNode() and _XMLCreateChildNodeWAttr()
; .Jun 12, 2007 Added workaround for MSXML6 to parse file with DTD's
; .Jun 13, 2007 Fixed bug in _XMLGetField() where all text was returned in one node.
; . Actually this is not a bug, because it is the way that WC3 says it will be returned
; . However, it will now return in a way that is expected.
; . _XMLGetValue now returns just the text associated with the node or empty string.
; .Jul 20, 2007 Fixed bug where failure to open the xml file would return an empty xml object, it now returns 0(no object).
; . Added object check to all applicable functions.
; .Aug 08, 2007 Add a _XMLSetAutoSave() to turn off/on forced saving within each function. --Thanks drlava
; . Added check for previous COM error handler. --Thanks Lukasz Suleja
; .Aug 27,2007 Changed property setting order for _XMLFileOpen. The previous order was causing a problem with default namespaces.
; . -- It seems that "selectionLanguage" needs to be declared before some other properties.
; .Aug 31,2007 Fixed bug where _XMLUpdateField would inadvertantly erase child nodes.
; .Sep 07,2007 Fixed _XMLDeleteNode bug where non-existant node cause COM error.
; . Added _XMLNodeExist function to check for the existence of node or nodes matching the specified path
; .Jan 05,2008 Fixed documentation problem in function header with _XMLGetAttrib.
; .Feb 25,2008 Fixed dimensioning bug in _XMLGetChildren --Thanks oblique
; .Mar 05,2008 Return values fixed for the following functions: --Thanks oblique
; . _XMLFileOpen ,_XMLLoadXML,_XMLCreateFile,
; . Documentation fixed for _XMLGetNodeCount,_XMLGetChildren --Thanks oblique
; .Mar 07,2008 Small changes.
; . Fixed an issue point out by lgr.
; .Mar 27,2009 Added function to turn off auto indenting, modified _XMLSetAutoSave, add "force" flag to _XMLSaveDoc
; . Replace _XMLTransform with weaponx provided version.
; . Added _XMLSetAutoFormat, _XMLSetAutoSave, _XMLSaveDoc to function list in header.
; .Mar 28,2009 Changed and verified (hopefuly) all function headers to be inline with current standard.
; . Verifed return values make documentation.
; . Automatic saving is now off by default.
; . Automatic formatting is now off by default.
; .Mar 30,2009 Fixed a bug in _XMLGetChildren where passing the root would get values of grandchildren.
; .Apr 24,2009 Reverted Autosave and Autoformat.
; . Fixed doc error regrading Autoindent vs Autoformat.
; . Change boolean vars to start with $f instead of $b
; .Apr 25,2009 Experimental code to remove indenting text node when a node is deleted.
; .Apr 27,2010 added _XMLUpdateField2 per weaponx. Should update multiple nodes.
; .Aug 12,2010 Added remarks to _XMLCreateFile.
; Added func _XMLGetParent -- Thanks Mike Rerick
; Author ........: Stephen Podhajecki Eltorro, Weaponx
; ===============================================================================================================================
; XML DOM Wrapper functions

#cs defs to add to au3.api
_XMLCreateFile($sPath, $sRootNode, [$fOverwrite = False]) Creates an XML file with the given name and root.
_XMLFileOpen($sXMLFile,[$sNamespace=""],[$ver=-1]) Creates an instance of an XML file.
_XMLSaveDoc( $sFile="",$iForce = 0 ) Save the xml doc, use $iForce = 1 to force save if AutoSave is off.
; =============================================================================
_XMLGetChildNodes ( strXPath ) Selects XML child Node(s) of an element based on XPath input from root node.
_XMLGetNodeCount ( strXPath, strQry = "", iNodeType = 1 ) Get node count for specified path and type.
_XMLGetPath ( strXPath ) Returns a nodes full path based on XPath input from root node.
_XMLGetParent($strXPath) Gets the parent node name of the node pointed to by the XPath.
; =============================================================================
_XMLSelectNodes ( strXPath ) Selects XML Node(s) based on XPath input from root node.
_XMLGetField ( strXPath ) Get XML Field(s) based on XPath input from root node.
_XMLGetValue ( strXPath ) Get XML Field based on XPath input from root node.
_XMLGetChildText ( strXPath ) Selects XML child Node(s) of an element based on XPath input from root node.
_XMLUpdateField ( strXPath, strData ) Update existing node based on XPath specs.
_XMLUpdateField2 ( strXPath, strData ) Update existing node(s) based on XPath specs.
_XMLReplaceChild ( objOldNode, objNewNode, ns = "" ) Replaces a node with a new node.
; =============================================================================
_XMLDeleteNode ( strXPath ) Delete specified XPath node.
_XMLDeleteAttr ( strXPath, strAttrib ) Delete attribute for specified XPath
_XMLDeleteAttrNode ( strXPath, strAttrib ) Delete attribute node for specified XPath
; =============================================================================
_XMLGetAttrib ( strXPath, strAttrib, strQuery = "" ) Get XML attribute based on XPath input from root node.
_XMLGetAllAttrib ( strXPath, ByRef aName, ByRef aValue, strQry = "" ) Get all XML Field(s) attributes based on XPath input from root node.
_XMLGetAllAttribIndex ( strXPath, ByRef aName, ByRef aValue, strQry = "", NodeIndex = 0 ) Get all XML Field(s) attributes based on Xpathn and specific index.
_XMLSetAttrib ( strXPath, strAttrib, strValue = "" ) Set XML Field(s) attributes based on XPath input from root node.
; =============================================================================
_XMLCreateCDATA ( strNode, strCDATA, strNameSpc = "" ) Create a CDATA SECTION node directly under root.
_XMLCreateComment ( strNode, strComment ) Create a COMMENT node at specified path.
_XMLCreateAttrib ( strXPath,strAttrName,strAttrValue="" ) Creates an attribute for the specified node.
; =============================================================================
_XMLCreateRootChild ( strNode, strData = "", strNameSpc = "" ) Create node directly under root.
_XMLCreateRootNodeWAttr ( strNode, aAttr, aVal, strData = "", strNameSpc = "" ) Create a child node under root node with attributes.
_XMLCreateChildNode ( strXPath, strNode, strData = "", strNameSpc = "" ) Create a child node under the specified XPath Node.
_XMLCreateChildWAttr ( strXPath, strNode, aAttr, aVal, strData = "", strNameSpc = "" ) Create a child node under the specified XPath Node with Attributes.
; =============================================================================
_XMLSchemaValidate ( sXMLFile, ns, sXSDFile ) _XMLSchemaValidate($sXMLFile, $ns, $sXSDFile) Validate a document against a DTD.
_XMLGetDomVersion ( ) Returns the XSXML version currently in use.
_XMLError ( sError = "" ) Sets or Gets XML error message generated by XML functions.
_XMLUDFVersion ( ) Returns the UDF Version number.
_XMLTransform ( oXMLDoc, Style = "",szNewDoc="" ) Transfroms the document using built-in sheet or xsl file passed to function.
_XMLNodeExists( $strXPath) Checks for the existence of the specified path.
; =============================================================================
_XMLSetAutoFormat( $fAutoFormat = True ) Turn auto indenting on or off.
_XMLSetAutoSave( $fSave = True ) Set the automatic save to on or off.
#ce

; #VARIABLES# ===================================================================================================================
Global Const $_XMLUDFVER = "1.0.3.98"
Global Const $NODE_ELEMENT = 1
Global Const $NODE_ATTRIBUTE = 2
Global Const $NODE_TEXT = 3
Global Const $NODE_CDATA_SECTION = 4
Global Const $NODE_ENTITY_REFERENCE = 5
Global Const $NODE_ENTITY = 6
Global Const $NODE_PROCESSING_INSTRUCTION = 7
Global Const $NODE_COMMENT = 8
Global Const $NODE_DOCUMENT = 9
Global Const $NODE_DOCUMENT_TYPE = 10
Global Const $NODE_DOCUMENT_FRAGMENT = 11
Global Const $NODE_NOTATION = 12
Global $strFile
Global $oXMLMyError ;COM error handler OBJ ; Initialize SvenP 's error handler
Global $sXML_error
Global $fDEBUGGING
Global $DOMVERSION = -1
Global $objDoc
Global $fXMLAUTOSAVE = True ;auto save updates
Global $fADDFORMATTING = True ;auto indent
; ===============================================================================================================================

; #FUNCTION# ===================================================================
; Name ..........: _XMLFileOpen
; Description ...: Creates an instance of an XML file.
; Syntax.........: _XMLFileOpen($strXMLFile[, $strNameSpc = ""[, $iVer = -1[, $fValOnParse = True]]])
; Parameters ....: $strXMLFile - the XML file to open
; $strNameSpc - the namespace to specifiy if the file uses one.
; $iVer - specifically try to use the version supplied here.
; $fValOnParse - validate the document as it is being parsed
; Return values .: Success - 1
; Failure - -1 and set @error to:
; |0 - No error
; |1 - Parse error, @Extended = MSXML reason
; |2 - No object
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLFileOpen($strXMLFile, $strNameSpc = "", $iVer = -1, $fValOnParse = True)
;==== pick your poison
If $iVer <> -1 Then
If $iVer > -1 And $iVer < 7 Then
$objDoc = ObjCreate("Msxml2.DOMdocument." & $iVer & ".0")
If IsObj($objDoc) Then
$DOMVERSION = $iVer
EndIf
Else
MsgBox(266288, "Error:", "Failed to create object with MSXML version " & $iVer)
SetError(1)
Return 0
EndIf
Else
For $x = 8 To 0 Step -1
If FileExists(@SystemDir & "\msxml" & $x & ".dll") Then
$objDoc = ObjCreate("Msxml2.DOMdocument." & $x & ".0")
If IsObj($objDoc) Then
$DOMVERSION = $x
ExitLoop
EndIf
EndIf
Next
EndIf
If Not IsObj($objDoc) Then
_XMLError("Error: MSXML not found. This object is required to use this program.")
SetError(2)
Return -1
EndIf
;Thanks Lukasz Suleja
$oXMLMyError = ObjEvent("AutoIt.Error")
If $oXMLMyError = "" Then
$oXMLMyError = ObjEvent("AutoIt.Error", "_XMLCOMEerr") ; ; Initialize SvenP 's error handler
EndIf
$strFile = $strXMLFile
$objDoc.async = False
$objDoc.preserveWhiteSpace = True
$objDoc.validateOnParse = $fValOnParse
If $DOMVERSION > 4 Then $objDoc.setProperty("ProhibitDTD", False)
$objDoc.Load($strFile)
$objDoc.setProperty("SelectionLanguage", "XPath")
$objDoc.setProperty("SelectionNamespaces", $strNameSpc)
If $objDoc.parseError.errorCode > 0 Then ConsoleWrite($objDoc.parseError.reason & @LF)
If $objDoc.parseError.errorCode <> 0 Then
_XMLError("Error opening specified file: " & $strXMLFile & @CRLF & $objDoc.parseError.reason)
;Tom Hohmann 2008/02/29
SetError(1, $objDoc.parseError.errorCode, -1)
$objDoc = 0
Return -1
EndIf
;Tom Hohmann 2008/02/29
Return 1
EndFunc ;==>_XMLFileOpen
;
; #FUNCTION# ===================================================================
; Name ..........: _XMLLoadXML
; Description ...: Creates an instance for a string of XML .
; Syntax.........: _XMLLoadXML($strXML[,$strNameSpc=""[, $iVer = -1[, $fValOnParse = True]]])
; Parameters ....: $strXML - The XML to load into the document
; $strNameSpc - the namespace to specifiy if the file uses one.
; $iVer - specifically try to use the version supplied here.
; $fValOnParse - Set the MSXML ValidateOnParse property
; Return values .: Success - 1
; Failure - -1 and set @error to
; |1 - failed to create object, @Extended = MSXML reason
; |2 - no object found (MSXML required for _XML functions
; Author ........: Stephen Podhajecki ,Lukasz Suleja,Tom Hohmann
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLLoadXML($strXML, $strNameSpc = "", $iVer = -1, $fValOnParse = True)
If $iVer <> -1 Then
If $iVer > -1 And $iVer < 7 Then
$objDoc = ObjCreate("Msxml2.DOMdocument." & $iVer & ".0")
If IsObj($objDoc) Then
$DOMVERSION = $iVer
EndIf
Else
MsgBox(266288, "Error:", "Failed to create object with MSXML version " & $iVer)
SetError(1)
Return 0
EndIf
Else
For $x = 8 To 0 Step -1
If FileExists(@SystemDir & "\msxml" & $x & ".dll") Then
$objDoc = ObjCreate("Msxml2.DOMdocument." & $x & ".0")
If IsObj($objDoc) Then
$DOMVERSION = $x
ExitLoop
EndIf
EndIf
Next
EndIf
If Not IsObj($objDoc) Then
_XMLError("Error: MSXML not found. This object is required to use this program.")
SetError(2)
Return -1
EndIf
;Thanks Lukasz Suleja
$oXMLMyError = ObjEvent("AutoIt.Error")
If $oXMLMyError = "" Then
$oXMLMyError = ObjEvent("AutoIt.Error", "_XMLCOMEerr") ; ; Initialize SvenP 's error handler
EndIf
$objDoc.async = False
$objDoc.preserveWhiteSpace = True
$objDoc.validateOnParse = $fValOnParse
If $DOMVERSION > 4 Then $objDoc.setProperty("ProhibitDTD", False)
$objDoc.LoadXml($strXML)
$objDoc.setProperty("SelectionLanguage", "XPath")
$objDoc.setProperty("SelectionNamespaces", $strNameSpc); "xmlns:ms='urn:schemas-microsoft-com:xslt'"
If $objDoc.parseError.errorCode <> 0 Then
_XMLError("Error loading the XML data: " & @CRLF & $objDoc.parseError.reason)
;Tom Hohmann 2008/02/29
SetError(1, $objDoc.parseError.errorCode, -1)
Return -1
EndIf
;Tom Hohmann 2008/02/29
Return 1
EndFunc ;==>_XMLLoadXML

; #FUNCTION# ===================================================================
; Name ..........: _XMLCreateFile
; Description ...: Create a new blank metafile with header.
; Syntax.........: _XMLCreateFile($strPath, $strRoot[, $fOverwrite = False[, $fUTF8 = False[, $ver = -1]]])
; Parameters ....: $strPath - The xml filename with full path to create
; $strRoot - The root of the xml file to create
; $fOverwrite - boolean flag to auto overwrite existing file of same name.
; $fUTF8 - boolean flag to specify UTF-8 encoding in header.
; $iVer - specifically try to use the version supplied here.
; Return values .: Success - 1
; Failure - -1 and sets @Error to:
; |0 - No error
; |1 - Failed to create file
; |2 - No object
; |3 - File creation failed MSXML error
; |4 - File exists
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......: Use _XMLFileOpen after using this function to access the file. (PsaltyDS)
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLCreateFile($strPath, $strRoot, $fOverwrite = False, $fUTF8 = False, $ver = -1)
Local $retval, $fe, $objPI, $rootElement
$fe = FileExists($strPath)
If $fe And Not $fOverwrite Then
$retval = (MsgBox(4097, "File Exists:", "The specified file exits." & @CRLF & "Click OK to overwrite file or cancel to exit."))
If $retval = 1 Then
FileCopy($strPath, $strPath & @YEAR & "-" & @MON & "-" & @MDAY & "_" & @HOUR & "-" & @MIN & "-" & @SEC & ".bak", 1)
FileDelete($strPath)
$fe = False
Else
_XMLError("Error failed to create file: " & $strPath & @CRLF & "File exists.")
SetError(4)
Return -1
EndIf
Else
FileCopy($strPath, $strPath & ".old", 1)
FileDelete($strPath)
$fe = False
EndIf
If $fe = False Then
If $ver <> -1 Then
If $ver > -1 And $ver < 7 Then
$objDoc = ObjCreate("Msxml2.DOMdocument." & $ver & ".0")
If IsObj($objDoc) Then
$DOMVERSION = $ver
EndIf
Else
MsgBox(266288, "Error:", "Failed to create object with MSXML version " & $ver)
SetError(3)
Return 0
EndIf
Else
For $x = 8 To 0 Step -1
If FileExists(@SystemDir & "\msxml" & $x & ".dll") Then
$objDoc = ObjCreate("Msxml2.DOMdocument." & $x & ".0")
If IsObj($objDoc) Then
$DOMVERSION = $x
ExitLoop
EndIf
EndIf
Next
EndIf
If Not IsObj($objDoc) Then
Return SetError(2)
EndIf
If $fUTF8 Then
$objPI = $objDoc.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8""")
Else
$objPI = $objDoc.createProcessingInstruction("xml", "version=""1.0""")
EndIf
$objDoc.appendChild($objPI)
$rootElement = $objDoc.createElement($strRoot)
$objDoc.documentElement = $rootElement
$objDoc.save($strPath)
;_XMLSaveDoc (,1)

If $objDoc.parseError.errorCode <> 0 Then
_XMLError("Error Creating specified file: " & $strPath)
; Tom Hohmann 2008/02/29
$objDoc = 0
SetError(1, $objDoc.parseError.errorCode, -1)
Return -1
EndIf
Return 1
Else
_XMLError("Error! Failed to create file: " & $strPath)
$objDoc = 0
SetError(1)
Return 0
EndIf
$objDoc = 0
Return 1
EndFunc ;==>_XMLCreateFile
; #FUNCTION# ===================================================================
; Name ..........: _XMLSelectNodes
; Description ...: Selects XML Node(s) based on XPath input from root node.
; Syntax.........: _XMLSelectNodes($strXPath)
; Parameters ....: $strXPath - xml tree path from root node (root/child/child..)
; Return values .: Success - An array of Nodes(count is in first element)
; Failure - -1 and set @Error = 1
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLSelectNodes(ByRef $objDoc, $strXPath)
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLSelectNodes")
Return SetError(2, 0, -1)
EndIf
Local $objNode, $objNodeList, $arrResponse[1], $xmlerr
$objNodeList = $objDoc.selectNodes($strXPath)
If Not IsObj($objNodeList) Then
_XMLError("\nNo matching nodes found")
Return SetError(1, 0, -1)
EndIf
If $objNodeList.length < 1 Then
_XMLError("\nNo matching nodes found")
Return SetError(1, 0, -1)
EndIf
For $objNode In $objNodeList
_XMLArrayAdd($arrResponse, $objNode.nodeName)
_DebugWrite($objNode.nodeName)
_DebugWrite($objNode.namespaceURI)
Next
$arrResponse[0] = $objNodeList.length
Return $arrResponse
_XMLError("Error Selecting Node(s): " & $strXPath & $xmlerr)
Return SetError(1, 0, -1)
EndFunc ;==>_XMLSelectNodes

; #FUNCTION# ===================================================================
; Name ..........: _XMLGetField
; Description ...: Get XML Field(s) based on XPath input from root node.
; Syntax.........: _XMLGetField($strXPath)
; Parameters ....: $strXPath - The XML tree path from root node (root/child/child..)
; Return values .: Success - An array of fields text values(count is in first element)
; Failure - -1 and sets @Error = 1
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLGetField(ByRef $objDoc, $strXPath)
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLGetField")
Return SetError(1, 2, -1)
EndIf
Local $objNodeList, $arrResponse[1], $xmlerr, $szNodePath
$objNodeList = $objDoc.selectSingleNode($strXPath)
If Not IsObj($objNodeList) Then
_XMLError("\nNo Matching Nodes found")
$arrResponse[0] = 0
Return SetError(2, 0, -1)
EndIf
If $objNodeList.hasChildNodes() Then
Local $count = $objNodeList.childNodes.length
For $x = 1 To $count
$objChild = $objNodeList.childNodes($x)
_DebugWrite("ParentNode=" & $objNodeList.parentNode.nodeType)
If $objNodeList.parentNode.nodeType = $NODE_DOCUMENT Then
$szNodePath = "/" & $objNodeList.baseName & "/*[" & $x & "]"
Else
$szNodePath = $objNodeList.baseName & "/*[" & $x & "]"
EndIf

$aRet = _XMLGetValue($objDoc, $szNodePath)
If IsArray($aRet) Then
If UBound($aRet) > 1 Then
_XMLArrayAdd($arrResponse, $aRet[1])
_DebugWrite("GetField>Text:" & $aRet[1])
EndIf
Else
_XMLArrayAdd($arrResponse, "")
_DebugWrite("GetField>Text:" & "")
EndIf
Next
$arrResponse[0] = UBound($arrResponse) - 1
Return $arrResponse
Else
$arrResponse[0] = 0
_XMLError("\nNo Child Nodes found")
Return SetError(1, 0, -1)
EndIf
_XMLError("Error Selecting Node(s): " & $strXPath & $xmlerr)
Return SetError(1, 0, -1)
EndFunc ;==>_XMLGetField
; #FUNCTION# ===================================================================
; Name ..........: _XMLGetValue
; Description ...: Get XML values based on XPath input from root node.
; Syntax.........: _XMLGetValue($strXPath)
; Parameters ....: $strXPath - xml tree path from root node (root/child/child..)
; Return values .: Success - An array of fields text values(count is in first element)
; Failure - -1 and sets @Error = 1, @Extended to:
; |0 - No matching node.
; |1 - No object passed.
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLGetValue(ByRef $objDoc,$strXPath)
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLGetValue")
Return SetError(1, 1, -1)
EndIf
Local $objNodeList, $arrResponse[1], $objNodeChild, $xmlerr
_DebugWrite("GetValue>$strXPath:" & $strXPath)
$objNodeList = $objDoc.documentElement.selectNodes($strXPath)
If $objNodeList.length > 0 Then
_DebugWrite("GetValue list length:" & $objNodeList.length)
For $objNode In $objNodeList
If $objNode.hasChildNodes() = False Then
_XMLArrayAdd($arrResponse, $objNode.nodeValue)
Else
For $objNodeChild In $objNode.childNodes()
If $objNodeChild.nodeType = $NODE_CDATA_SECTION Then
_XMLArrayAdd($arrResponse, $objNodeChild.data)
_DebugWrite("GetValue>CData:" & $objNodeChild.data)
ElseIf $objNodeChild.nodeType = $NODE_TEXT Then
_XMLArrayAdd($arrResponse, $objNodeChild.Text)
_DebugWrite("GetValue>Text:" & $objNodeChild.Text)
EndIf
Next
EndIf
Next
$arrResponse[0] = UBound($arrResponse) - 1
Return $arrResponse
Else
$xmlerr = @CRLF & "No matching node(s)found!"
Return SetError(1, 0, -1)
EndIf
_XMLError("Error Retrieving: " & $strXPath & $xmlerr)

Return SetError(1, 0, -1)
EndFunc ;==>_XMLGetValue
; #FUNCTION# ===================================================================
; Name ..........: _XMLDeleteNode
; Description ...: Deletes XML Node based on XPath input from root node.
; Syntax.........: _XMLDeleteNode($strXPath)
; Parameters ....: $strXPath - The XML tree path from root node (root/child/child..)
; Return values .: Success - 1
; Failure - -1 and sets @Error to:
; |0 - No error
; |1 - Deletion error
; |2 - No object passed
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLDeleteNode(ByRef $objDoc,$strXPath)
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLDeleteNode")
Return SetError(2, 0, -1)
EndIf
Local $objNode, $xmlerr
$objNode = $objDoc.selectNodes($strXPath)
If Not IsObj($objNode) Then $xmlerr = @CRLF & "Node Not found"
If @error = 0 Then
For $objChild In $objNode
If $objChild.hasChildNodes Then
For $objGrandChild in $objChild.childNodes
If $objGrandChild.nodeType = $NODE_TEXT Then
If StringStripWS($objGrandChild.text,7) = "" Then
$objChild.removeChild($objGrandChild)
EndIf
EndIf
Next
EndIf
$objChild.parentNode.removeChild($objChild)
Next
_XMLSaveDoc($strFile)
Return 1
EndIf
_XMLError("Error Deleting Node: " & $strXPath & $xmlerr)
Return SetError(1, 0, -1)
EndFunc ;==>_XMLDeleteNode

; #FUNCTION# ===================================================================
; Name ..........: _XMLDeleteAttr
; Description ...: Delete XML Attribute based on XPath input from root node.
; Syntax.........: _XMLDeleteAttr($strXPath, $strAttrib)
; Parameters ....: $strXPath - The XML tree path from root node (root/child/child..)
; $strAttribute - The attribute node to delete
; Return values .: Success - 1
; Failure - -1 and sets @Error to:
; |0 - No error
; |1 - Error removing attribute
; |2 - No object
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLDeleteAttr(ByRef $objDoc,$strXPath, $strAttrib)
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLDeleteAttr")
Return SetError(2, 0, -1)
EndIf
Local $objNode, $objAttr, $xmlerr
$objNode = $objDoc.selectSingleNode($strXPath)
If IsObj($objNode) Then
$objAttr = $objNode.getAttributeNode($strAttrib)
If Not (IsObj($objAttr)) Then
_XMLError("Attribute " & $strAttrib & " does not exist!")
Return SetError(2, 0, -1)
EndIf
$objAttr = $objNode.removeAttribute($strAttrib)
_XMLSaveDoc($strFile)
Return 1
EndIf
_XMLError("Error Removing Attribute: " & $strXPath & " - " & $strAttrib & @CRLF & $xmlerr)
$xmlerr = ""
Return SetError(1, 0, -1)
EndFunc ;==>_XMLDeleteAttr
; #FUNCTION# ===================================================================
; Name ..........: _XMLDeleteAttrNode
; Description ...: Delete XML Attribute node based on XPath input from root node.
; Syntax.........: _XMLDeleteAttrNode($strXPath, $strAttrib)
; Parameters ....: $strXpath - XML tree path from root node (root/child/child..)
; $strAttrib - The attribute node to delete
; Return values .: Success - 1
; Failure - -1 and sets @Error to:
; |0 - No error
; |1 - Error removing node
; |2 - No object
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLDeleteAttrNode(ByRef $objDoc,$strXPath, $strAttrib)
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLDeleteAttrNode")
Return SetError(2, 0, -1)
EndIf
Local $objNode, $objAttr, $xmlerr
$objNode = $objDoc.selectSingleNode($strXPath)
If Not IsObj($objNode) Then
_XMLError("\nSpecified node not found!")
Return SetError(2, 0, -1)
EndIf
$objAttr = $objNode.removeAttributeNode($objNode.getAttributeNode($strAttrib))
_XMLSaveDoc($strFile)
If Not (IsObj($objAttr)) Then
_XMLError("\nUnspecified error:!")
Return SetError(1, 0, -1)
EndIf
Return 1
EndFunc ;==>_XMLDeleteAttrNode
; #FUNCTION# ===================================================================
; Name ..........: _XMLGetAttrib
; Description ...: Get XML Field based on XPath input from root node.
; Syntax.........: _XMLGetAttrib($strXPath, $strAttrib[, $strQuery = ""])
; Parameters ....: $strXPath - XML tree path from root node (root/child/child..)
; $strAttrib - The attribute node to read.
; $strQuery - The query string in xml format
; Return values .: Success - The attribute value.
; Failure - -1 and sets @Error to:
; |0 - No error
; |1 - Attribute not found.
; |2 - No object
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLGetAttrib(ByRef $objDoc,$strXPath, $strAttrib, $strQuery = "")
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLGetAttrib")
Return SetError(2, 0, -1)
EndIf
;Local $objNodeList, $arrResponse[1], $i, $xmlerr, $objAttr
Local $objNodeList, $arrResponse, $i, $xmlerr, $objAttr
$objNodeList = $objDoc.documentElement.selectNodes($strXPath & $strQuery)
_DebugWrite("Get Attrib length= " & $objNodeList.length)
If $objNodeList.length > 0 Then
For $i = 0 To $objNodeList.length - 1
$objAttr = $objNodeList.item($i).getAttribute($strAttrib)
$arrResponse = $objAttr
_DebugWrite("RET>>" & $objAttr)
Next
Return $arrResponse
EndIf
$xmlerr = "\nNo qualified items found"
_XMLError("Attribute " & $strAttrib & " not found for: " & $strXPath & $xmlerr)
Return SetError(1, 0, -1)
EndFunc ;==>_XMLGetAttrib
; #FUNCTION# ===================================================================
; Name ..........: _XMLSetAttrib
; Description ...: Set XML Field(s) based on XPath input from root node.
; Syntax.........: _XMLSetAttrib($strXPath, $strAttrib[, $strValue = ""[, $iIndex =-1]])
; Parameters ....: $strXPath - Xml tree path from root node (root/child/child..)
; $strAttrib - The attribute to set.
; $strValue - The value to give the attribute defaults to ""
; $iIndex - Used to specify a specific index for "same named" nodes.
; Return values .: Success - Anarray of fields text values
; Failure - -1 and sets @error to 1
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLSetAttrib(ByRef $objDoc,$strXPath, $strAttrib, $strValue = "", $iIndex = -1)
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLSetAttrib")
Return SetError(1, 8, -1)
EndIf
Local $objNodeList, $arrResponse[1], $i
$objNodeList = $objDoc.selectNodes($strXPath)
_DebugWrite(" Node list Length: " & $objNodeList.length)
If @error = 0 And $objNodeList.length > 0 Then
If $iIndex > 0 Then
$arrResponse[0] = $objNodeList.item($iIndex).SetAttribute($strAttrib, $strValue)
Else
ReDim $arrResponse[$objNodeList.length]
For $i = 0 To $objNodeList.length - 1
$arrResponse[$i] = $objNodeList.item($i).SetAttribute($strAttrib, $strValue)
If $objDoc.parseError.errorCode <> 0 Then ExitLoop
Next
EndIf
If $objDoc.parseError.errorCode <> 0 Then
_XMLError("Error setting attribute for: " & $strXPath & @CRLF & $objDoc.parseError.reason)
Return SetError(1, $objDoc.parseError.errorCode, -1)
EndIf
_XMLSaveDoc($strFile)
Return $arrResponse
EndIf
_XMLError("Error failed to set attribute for: " & $strXPath & @CRLF)
SetError(1)
Return -1
EndFunc ;==>_XMLSetAttrib
; #FUNCTION# ===================================================================
; Name ..........: _XMLGetAllAttrib
; Description ...: Get all XML Field(s) attributes based on XPath input from root node.
; Syntax.........: _XMLGetAllAttrib($strXPath, ByRef $aName, ByRef $aValue[, $strQry = ""])
; Parameters ....: $strXPath - XML tree path from root node (root/child/child..)
; $aName - The array to return the attrib names
; $aValue - The array to return the attrib values
; $strQuery - DOM compliant query string (not really necessary as it becomes part of the path)
; Return values .: Success - array of fields text values(number of items is in [0][0])
; Failure - @error set to 1 and returns -1
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLGetAllAttrib(ByRef $objDoc,$strXPath, ByRef $aName, ByRef $aValue, $strQry = "")
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLGetAllAttrib")
Return SetError(1, 9, -1)
EndIf
Local $objNodeList, $objQueryNodes, $objNode, $arrResponse[2][1], $i
$objQueryNodes = $objDoc.selectNodes($strXPath & $strQry)
If $objQueryNodes.length > 0 Then
For $objNode In $objQueryNodes
$objNodeList = $objNode.attributes
If ($objNodeList.length) Then
_DebugWrite("Get all attrib " & $objNodeList.length)
ReDim $arrResponse[2][$objNodeList.length + 2]
ReDim $aName[$objNodeList.length]
ReDim $aValue[$objNodeList.length]
For $i = 0 To $objNodeList.length - 1
$arrResponse[0][$i + 1] = $objNodeList.item($i).nodeName
$arrResponse[1][$i + 1] = $objNodeList.item($i).Value
$aName[$i] = $objNodeList.item($i).nodeName
$aValue[$i] = $objNodeList.item($i).Value
Next
Else
_XMLError("No Attributes found for node")
Return SetError(1, 0, -1)
EndIf
Next
$arrResponse[0][0] = $objNodeList.length
Return $arrResponse
EndIf
_XMLError("Error retrieving attributes for: " & $strXPath & @CRLF)
Return SetError(1, 0, -1)
; EndIf
EndFunc ;==>_XMLGetAllAttrib
; #FUNCTION# ===================================================================
; Name ..........: _XMLUpdateField
; Description ...: Update existing node(s) based on XPath specs.
; Syntax.........: _XMLUpdateField($strXPath, $strData)
; Parameters ....: $strXPath - Path from root node.
; $strData - The data to update the node with.
; Return values .: Success - 1
; Failure - -1 and sets @error to 1.
; Author ........: Stephen Podhajecki
; Modified ......: Weaponx
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLUpdateField(ByRef $objDoc,$strXPath, $strData)
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLUpdateField")
Return SetError(1, 9, -1)
EndIf
Local $objField, $fUpdate, $objNode
#forceref $objField
$objField = $objDoc.selectSingleNode($strXPath)
If IsObj($objField) Then
If $objField.hasChildNodes Then
For $objChild In $objField.childNodes()
If $objChild.nodetype = $NODE_TEXT Then
$objChild.Text = $strData
$fUpdate = True
ExitLoop
EndIf
Next
EndIf
If $fUpdate = False Then
$objNode = $objDoc.createTextNode($strData)
$objField.appendChild($objNode)
EndIf
_XMLSaveDoc($strFile)
$objField = ""
Return 1
EndIf
_XMLError("Failed to update field for: " & $strXPath & @CRLF)
Return SetError(1, 0, -1)

EndFunc ;==>_XMLUpdateField

; #FUNCTION# ===================================================================
; Name ..........: _XMLUpdateField2
; Description ...: Update existing node(s) based on XPath specs.
; Syntax.........: _XMLUpdateField2($strXPath, $strData)
; Parameters ....: $strXPath - Path from root node.
; $strData - The data to update the node with.
; Return values .: Success - 1
; Author ........: Stephen Podhajecki (eltorro)
; Modified.......: Weaponx
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: [yes/no]
; ================================================================================
Func _XMLUpdateField2(ByRef $objDoc,$strXPath, $strData)
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLUpdateField2")
Return SetError(1, 9, -1)
EndIf

Local $objNodeList, $objNodeChild, $xmlerr

$objNodeList = $objDoc.documentElement.selectNodes($strXPath)
If $objNodeList.length > 0 Then
_DebugWrite("GetValue list length:" & $objNodeList.length)
For $objNode In $objNodeList
If $objNode.hasChildNodes() = False Then
;???
Else
For $objNodeChild In $objNode.childNodes()
If $objNodeChild.nodetype = $NODE_TEXT Then
$objNodeChild.Text = $strData
$bUpdate = True
ExitLoop
EndIf
Next
EndIf
Next
Return 1
Else
$xmlerr = @CRLF & "No matching node(s)found!"
Return SetError(1, 0, -1)
EndIf
_XMLError("Error Retrieving: " & $strXPath & $xmlerr)
Return SetError(1, 0, -1)
EndFunc ;==>_XMLUpdateField2

; #FUNCTION# ===================================================================
; Name ..........: _XMLCreateCDATA
; Description ...: Create a CDATA SECTION node directly under root.
; Syntax.........: _XMLCreateCDATA($strNode, $strCDATA[, $strNameSpc = ""])
; Parameters ....: $strNode - name of node to create
; $strData - CDATA value
; $strNameSpc - the namespace to specifiy if the xml uses one.
; Return values .: Success - 1
; Failure - 1 and sets @Error to 1.
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......: fixme, won't append to exisiting node. must create new node.
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLCreateCDATA(ByRef $objDoc,$strNode, $strCDATA, $strNameSpc = "")
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLCreateCDATA")
Return SetError(1, 10, -1)
EndIf
Local $objChild, $objNode
$objNode = $objDoc.createNode($NODE_ELEMENT, $strNode, $strNameSpc)
If IsObj($objNode) Then
If Not ($objNode.hasChildNodes()) Then
_AddFormat($objDoc, $objNode)
EndIf
$objChild = $objDoc.createCDATASection($strCDATA)
$objNode.appendChild($objChild)
$objDoc.documentElement.appendChild($objNode)
_XMLSaveDoc($strFile)
_AddFormat($objDoc)
$objChild = ""
Return 1
EndIf
_XMLError("Failed to create CDATA Section: " & $strNode & @CRLF)
Return SetError(1, 0, -1)
EndFunc ;==>_XMLCreateCDATA
; #FUNCTION# ===================================================================
; Name ..........: _XMLCreateComment
; Description ...: Create a COMMENT node at specified path.
; Syntax.........: _XMLCreateComment($strNode, $strComment)
; Parameters ....: $strNode - The name of node to create.
; $strComment - The comment to add the to the xml file.
; Return values .: Success - 1
; Failure - -1 and @error set to 1.
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLCreateComment(ByRef $objDoc,$strNode, $strComment)
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLCreateComment")
Return SetError(1, 11, -1)
EndIf
Local $objChild, $objNode

$objNode = $objDoc.selectSingleNode($strNode)
If IsObj($objNode) Then
If Not ($objNode.hasChildNodes()) Then
_AddFormat($objDoc, $objNode)
EndIf
$objChild = $objDoc.createComment($strComment)
$objNode.insertBefore($objChild, $objNode.childNodes(0))
_XMLSaveDoc($strFile)
_AddFormat($objDoc)
$objChild = ""
Return 1
EndIf
_XMLError("Failed to root child: " & $strNode & @CRLF)
Return SetError(1, 0, -1)
EndFunc ;==>_XMLCreateComment
; #FUNCTION# ===================================================================
; Name ..........: _XMLCreateAttribute
; Description ...: Adds an XML Attribute to specified node.
; Syntax.........: _XMLCreateAttrib($strXPath, $strAttrName[, $strAttrValue = ""])
; Parameters ....: $strXPath - The XML tree path from root node (root/child/child..)
; $strAttrName - The attribute to set.
; $strAttrValue - The value to give the attribute, defaults to "".
; Return values .: Success - 1
; Failure - 0 or @error set to 0 and return -1
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLCreateAttrib(ByRef $objDoc,$strXPath, $strAttrName, $strAttrValue = "")
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLCreateAttrib")
Return SetError(1, 12, -1)
EndIf
Local $objNode, $objAttr, $objAttrVal, $err
$objNode = $objDoc.selectSingleNode($strXPath)
If IsObj($objNode) Then
$objAttr = $objDoc.createAttribute($strAttrName);, $strNameSpc)
$objNode.SetAttribute($strAttrName, $strAttrValue)
_XMLSaveDoc($strFile)
$objAttr = 0
$objAttrVal = 0
$objNode = 0
$err = $objDoc.parseError.errorCode
If $err = 0 Then Return 1
EndIf
_XMLError("Error creating Attribute: " & $strAttrName & @CRLF & $strXPath & " does not exist." & @CRLF)
Return 0
EndFunc ;==>_XMLCreateAttrib
; #FUNCTION# ===================================================================
; Name ..........: _XMLCreateRootChild
; Description ...: Create node directly under root.
; Syntax.........: _XMLCreateRootChild($strNode[, $strData = ""[, $strNameSpc = ""]])
; Parameters ....: $strNode - The name of node to create.
; $strData - The optional value to create
; $$strNameSpc - the namespace to specifiy if the file uses one.
; Return values .: Success - 1
; Failure - -1 and @error set to 1.
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLCreateRootChild(ByRef $objDoc,$strNode, $strData = "", $strNameSpc = "")
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLCreateRootChild")
Return SetError(1, 14, -1)
EndIf
;ConsoleWrite("_XMLCreateRootChild:"&$strNode&@LF)
Local $objChild
If Not ($objDoc.documentElement.hasChildNodes()) Then
_AddFormat($objDoc)
EndIf
$objChild = $objDoc.createNode($NODE_ELEMENT, $strNode, $strNameSpc)
If IsObj($objChild) Then
If $strData <> "" Then $objChild.text = $strData
$objDoc.documentElement.appendChild($objChild)
_XMLSaveDoc($strFile)
_AddFormat($objDoc)
$objChild = 0
Return 1
EndIf
_XMLError("Failed to root child: " & $strNode & @CRLF)
Return SetError(1, 0, -1)
EndFunc ;==>_XMLCreateRootChild
; #FUNCTION# ===================================================================
; Name ..........: _XMLCreateRootNodeWAttr
; Description ...: Create a child node under root node with attributes.
; Syntax.........: _XMLCreateRootNodeWAttr($strNode, $aAttr, $aVal[, $strData = ""[, $strNameSpc = ""]])
; Parameters ....: $strNode - The node to add with attibute(s)
; $aAttr - The attribute name(s) -- can be array
; $aVal - The attribute value(s) -- can be array
; $strData - The optional value to give the node.
; Return values .: Success - 1
; Failure - -1 and @error set to:
; |1 - Could not create node.
; |2 - Mismatch between attribute name and value counts.
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......: This function requires that each attribute name has a corresponding value.
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLCreateRootNodeWAttr(ByRef $objDoc,$strNode, $aAttr, $aVal, $strData = "", $strNameSpc = "")
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLCreateRootNodeWAttr")
Return SetError(1, 15, -1)
EndIf
Local $objChild, $objAttr, $objAttrVal
$objChild = $objDoc.createNode($NODE_ELEMENT, $strNode, $strNameSpc)
If IsObj($objChild) Then
If $strData <> "" Then $objChild.text = $strData
If Not ($objDoc.documentElement.hasChildNodes()) Then
_AddFormat($objDoc)
EndIf
If IsArray($aAttr) And IsArray($aVal) Then
If UBound($aAttr) <> UBound($aVal) Then
_XMLError("Attribute and value mismatch" & @CRLF & "Please make sure each attribute has a matching value.")
Return SetError(2, 15, -1)
Else
Local $i
For $i = 0 To UBound($aAttr) - 1
If $aAttr[$i] = "" Then
_XMLError("Error creating child node: " & $strNode & @CRLF & " Attribute Name Cannot be NULL." & @CRLF)
Return SetError(1, 0, -1)
EndIf
$objAttr = $objDoc.createAttribute($aAttr[$i]);, $strNameSpc)
$objChild.SetAttribute($aAttr[$i], $aVal[$i])
Next
EndIf
Else
$objAttr = $objDoc.createAttribute($aAttr)
$objChild.SetAttribute($aAttr, $aVal)
EndIf
$objDoc.documentElement.appendChild($objChild)
_XMLSaveDoc($strFile)
_AddFormat($objDoc)
$objChild = 0
Return 1
EndIf
_XMLError("Failed to create root child with attributes: " & $strNode & @CRLF)
Return SetError(1, 0, -1)
EndFunc ;==>_XMLCreateRootNodeWAttr
; #FUNCTION# ===================================================================
; Name ..........: _XMLCreateChildNode
; Description ...: Create a child node under the specified XPath Node.
; Syntax.........: _XMLCreateChildNode($strXPath, $strNode[, $strData = ""[, $strNameSpc = ""]])
; Parameters ....: $strXPath - The node from root.
; $strNode - Node name to add.
; $strData - Value to give the node
; Return values .: Success - 1
; Failure - -1 and @error set to 1.
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLCreateChildNode(ByRef $objDoc,$strXPath, $strNode, $strData = "", $strNameSpc = "")
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLCreateChildNode")
Return SetError(1, 16, -1)
EndIf
Local $objParent, $objChild, $objNodeList
$objNodeList = $objDoc.selectNodes($strXPath)
If IsObj($objNodeList) And $objNodeList.length > 0 Then
For $objParent In $objNodeList
If Not ($objParent.hasChildNodes()) Then
_AddFormat($objDoc, $objParent)
EndIf
If $strNameSpc = "" Then
If Not ($objParent.namespaceURI = 0 Or $objParent.namespaceURI = "") Then $strNameSpc = $objParent.namespaceURI
EndIf
;ConsoleWrite("$strNameSpc=" & $strNameSpc & @LF)
$objChild = $objDoc.createNode($NODE_ELEMENT, $strNode, $strNameSpc)
If $strData <> "" Then $objChild.text = $strData
$objParent.appendChild($objChild)
_AddFormat($objDoc, $objParent)
Next
_XMLSaveDoc($strFile)
$objParent = ""
$objChild = ""
Return 1
EndIf
_XMLError("Error creating child node: " & $strNode & @CRLF & $strXPath & " does not exist." & @CRLF)
Return SetError(1, 0, -1)
EndFunc ;==>_XMLCreateChildNode
; #FUNCTION# ===================================================================
; Name ..........: _XMLCreateChildNodeWAttr
; Description ...: Create a child node(s) under the specified XPath Node with attributes.
; Syntax.........: _XMLCreateChildNodeWAttr($strXPath, $strNode, $aAttr, $aVal[, $strData = ""[, $strNameSpc = ""]])
; Parameters ....: $sPath - Path from root
; $sNode - node to add with attibute(s)
; $aAttr - The attribute name(s) -- can be array
; $aVal - The attribute value(s) -- can be array
; $strData - The optional value to give the child node.
; Return values .: Success - 1
; Failure - -1, @error set to:
; |1 - Could not create node.
; |2 - Mismatch between attribute name and value counts.
; |3 - Attribute Name cannot be empty string.
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......: This function requires that each attribute name has a corresponding value.
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLCreateChildNodeWAttr(ByRef $objDoc,$strXPath, $strNode, $aAttr, $aVal, $strData = "", $strNameSpc = "")
Return _XMLCreateChildWAttr($strXPath, $strNode, $aAttr, $aVal, $strData, $strNameSpc)
EndFunc ;==>_XMLCreateChildNodeWAttr

; #FUNCTION# ===================================================================
; Name ..........: _XMLCreateChildWAttr
; Description ...: Create a child node(s) under the specified XPath Node with attributes.
; Syntax.........: _XMLCreateChildWAttr($strXPath, $strNode, $aAttr, $aVal[, $strData = ""[, $strNameSpc = ""]])
; Parameters ....: $sPath - Path from root
; $sNode - The node to add with attibute(s)
; $aAttr - The attribute name(s) -- can be array
; $aVal - The attribute value(s) -- can be array
; $strData - The optional value to give the child node.
; Return values .: Success - 1
; Failure - -1, @error set to:
; |1 - Could not create node.
; |2 - Mismatch between attribute name and value counts.
; |3 - Attribute Name cannot be empty string.
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......: This function requires that each attribute name has a corresponding value.
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLCreateChildWAttr(ByRef $objDoc,$strXPath, $strNode, $aAttr, $aVal, $strData = "", $strNameSpc = "")
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLCreateChildWAttr")
Return SetError(1, 18, -1)
EndIf
Local $objParent, $objChild, $objAttr, $objAttrVal, $objNodeList
$objNodeList = $objDoc.selectNodes($strXPath)
_DebugWrite("Node Selected")
If IsObj($objNodeList) And $objNodeList.length <> 0 Then
_DebugWrite("Entering if")
For $objParent In $objNodeList
If Not ($objParent.hasChildNodes()) Then
_AddFormat($objDoc, $objParent)
EndIf
_DebugWrite("Entering for")
If $strNameSpc = "" Then
If Not ($objParent.namespaceURI = 0 Or $objParent.namespaceURI = "") Then $strNameSpc = $objParent.namespaceURI
EndIf
$objChild = $objDoc.createNode($NODE_ELEMENT, $strNode, $strNameSpc)
If @error Then Return -1
If $strData <> "" Then $objChild.text = $strData
If IsArray($aAttr) And IsArray($aVal) Then
If UBound($aAttr) <> UBound($aVal) Then
_XMLError("Attribute and value mismatch" & @CRLF & "Please make sure each attribute has a matching value.")
Return SetError(2, 0, -1)
Else
Local $i
For $i = 0 To UBound($aAttr) - 1
_DebugWrite("Entering inside for")
If $aAttr[$i] = "" Then
_XMLError("Error creating child node: " & $strNode & @CRLF & " Attribute Name Cannot be NULL." & @CRLF)
Return SetError(1, 0, -1)
EndIf
_DebugWrite($aAttr[$i] & " " & $strNameSpc)
$objAttr = $objDoc.createAttribute($aAttr[$i]);, $strNameSpc)
If @error Then ExitLoop
$objChild.SetAttribute($aAttr[$i], $aVal[$i])
If @error <> 0 Then
_XMLError("Error creating child node: " & $strNode & @CRLF & $strXPath & " does not exist." & @CRLF)
Return SetError(1, 0, -1)
EndIf
_DebugWrite("Looping inside for")
Next
EndIf
Else
If IsArray($aAttr) Or IsArray($aVal) Then
_XMLError("Type non-Array and Array detected" & @LF)
Return SetError(1, 0, -1)
EndIf
If $aAttr = "" Then
_XMLError("Attribute Name cannot be empty string." & @LF)
Return SetError(3, 0, -1)
EndIf
_DebugWrite($aAttr & " " & $strNameSpc)
$objAttr = $objDoc.createAttribute($aAttr);, $strNameSpc)
$objChild.SetAttribute($aAttr, $aVal)
EndIf
$objParent.appendChild($objChild)
_DebugWrite("Looping for")
Next
_AddFormat($objDoc, $objParent)
_XMLSaveDoc($strFile)
_DebugWrite("Saved")
$objParent = ""
$objChild = ""
_DebugWrite("Returning")
Return 1
EndIf
_XMLError("Error creating child node: " & $strNode & @CRLF & $strXPath & " does not exist." & @CRLF)
Return SetError(1, 0, -1)
EndFunc ;==>_XMLCreateChildWAttr
; #FUNCTION# ===================================================================
; Name ..........: _XMLGetChildText
; Description ...: Selects XML child Node(s) of an element based on XPath input from root node.
; Syntax.........: _XMLGetChildText($strXPath)
; Parameters ....: $strXPath - The xml tree path from root node (root/child/child..)
; Return values .: Success - An array of Nodes.
; Failure - -1 and @error set to 1.
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLGetChildText(ByRef $objDoc,$strXPath)
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLGetChildText")
Return SetError(1, 19, -1)
EndIf
Local $objNodeList, $arrResponse[1], $xmlerr
$objNodeList = $objDoc.selectSingleNode($strXPath)
If Not IsObj($objNodeList) Then
_XMLError(@CRLF & "No Matching Nodes found")
$arrResponse[0] = 0
Return SetError(1, 0, -1)
EndIf
If $objNodeList.hasChildNodes() Then
For $objChild In $objNodeList.childNodes()
If $objChild.nodeType = $NODE_ELEMENT Then
_XMLArrayAdd($arrResponse, $objChild.baseName)
ElseIf $objChild.nodeType = $NODE_TEXT Then
_XMLArrayAdd($arrResponse, $objChild.text)
EndIf
Next
$arrResponse[0] = UBound($arrResponse) - 1
Return $arrResponse
EndIf
$arrResponse[0] = 0
$xmlerr = @CRLF & "No Child Text Nodes found"
_XMLError("Error Selecting Node(s): " & $strXPath & $xmlerr)
Return SetError(1, 0, -1)
EndFunc ;==>_XMLGetChildText
; #FUNCTION# ===================================================================
; Name ..........: _XMLGetChildNodes
; Description ...: Selects XML child Node(s) of an element based on XPath input from root node.
; Syntax.........: _XMLGetChildNodes($strXPath)
; Parameters ....: $strXPath - The xml tree path from root node (root/child/child..)
; Return values .: Success - An array of Nodes, count in [0] element.
; Failure - -1 and @error set to 1.
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLGetChildNodes(ByRef $objDoc,$strXPath)
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLGetChildNodes")
Return SetError(1, 20, -1)
EndIf
Local $objNodeList, $arrResponse[1], $xmlerr
$objNodeList = $objDoc.selectSingleNode($strXPath)
If Not IsObj($objNodeList) Then
_XMLError(@LF & "No Matching Nodes found")
$arrResponse[0] = 0
Return SetError(1, 0, -1)
EndIf
If $objNodeList.hasChildNodes() Then
For $objChild In $objNodeList.childNodes()
If $objChild.nodeType() = $NODE_ELEMENT Then
_DebugWrite($objChild.NamespaceURI & "::" & $objChild.baseName & @LF)
_XMLArrayAdd($arrResponse, $objChild.baseName)
EndIf
Next
$arrResponse[0] = UBound($arrResponse) - 1
Return $arrResponse
EndIf
$arrResponse[0] = 0
$xmlerr = @LF & "No Child Nodes found"
_XMLError("Error Selecting Node(s): " & $strXPath & $xmlerr)
Return SetError(1, 0, -1)
EndFunc ;==>_XMLGetChildNodes
; #FUNCTION# ===================================================================
; Name ..........: _XMLGetChildren
; Description ...: Selects XML child Node(s) of an element based on XPath input from root node and returns there text values.
; Syntax.........: _XMLGetChildren($strXPath)
; Parameters ....: $strXPath - The XML tree path from root node (root/child/child..)
; Return values .: Success - An array where:
; |$array[0][0] = Size of array
; |$array[1][0] = Name
; |$array[1][1] = Text
; |$array[1][2] = NameSpaceURI
; |...
; |$array[n][0] = Name
; |$array[n][1] = Text
; |$array[n][2] = NamespaceURI
; Failure - -1 and @error set to 1.
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLGetChildren(ByRef $objDoc,$strXPath)
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLGetChildren")
Return SetError(1, 21, -1)
EndIf
Local $objNodeList, $arrResponse[1][3], $xmlerr
$objNodeList = $objDoc.selectSingleNode($strXPath)
If Not IsObj($objNodeList) Then
_XMLError(@LF & "No Matching Nodes found")
$arrResponse[0][0] = 0
Return SetError(1, 0, -1)
EndIf
If $objNodeList.hasChildNodes() Then
For $objChild In $objNodeList.childNodes()
If $objChild.nodeType() = $NODE_ElEMENT Then
If $objChild.hasChildNodes() Then
For $objChildNode in $objChild.childNodes()
If $objChildNode.nodeType() = $NODE_TEXT Then
Local $dims = UBound($arrResponse, 1)
ReDim $arrResponse[$dims + 1][3]
$arrResponse[$dims][0] = $objChildNode.parentNode.baseName
$arrResponse[$dims][1] = $objChildNode.text
$arrResponse[$dims][2] = $objChildNode.NamespaceURI
;_XMLArrayAdd($arrResponse, $objChild.baseName)
EndIf
Next
EndIf
EndIf
Next
$arrResponse[0][0] = UBound($arrResponse, 1) - 1
Return $arrResponse
EndIf
$arrResponse[0][0] = 0
$xmlerr = @LF & "No Child Nodes found"
_XMLError("Error Selecting Node(s): " & $strXPath & $xmlerr)
Return SetError(1, 0, -1)
EndFunc ;==>_XMLGetChildren

; #FUNCTION# ===================================================================
; Name ..........: _XMLGetNodeCount
; Description ...: Get Node Count based on XPath input from root node.
; Syntax.........: _XMLGetNodeCount($strXPath[, $strQry = ""[, $iNodeType = 1]])
; Parameters ....: $strXPath - The XML tree path from root node (root/child/child..
; $strQry - A DOM compliant query string (not really necessary as it becomes part of the path
; $iNodeType - The type of node to count. (element, attrib, comment etc.)
; Return values .: Success - Number of nodes found (can be 0)
; Failure - -1 and @error set to 1.
; Author ........: Stephen Podhajecki & DickB
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLGetNodeCount(ByRef $objDoc,$strXPath, $strQry = "", $iNodeType = 1)
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLGetNodeCount")
Return SetError(1, 22, -1)
EndIf
Local $objQueryNodes, $objNode, $nodeCount = 0, $errMsg
$objQueryNodes = $objDoc.selectNodes($strXPath & $strQry)
If @error = 0 And $objQueryNodes.length > 0 Then
For $objNode In $objQueryNodes
If $objNode.nodeType = $iNodeType Then $nodeCount = $nodeCount + 1
Next
Return $nodeCount
Else
$errMsg = "No nodes of specified type found."
EndIf
_XMLError("Error retrieving node count for: " & $strXPath & @CRLF & $errMsg & @CRLF)
SetError(1)
Return -1
; EndIf
EndFunc ;==>_XMLGetNodeCount
;part of the path
; #FUNCTION# ===================================================================
; Name ..........: _XMLGetAllAttribIndex
; Description ...: Get all XML Field(s) attributes based on Xpathn and specific index.
; Syntax.........: _XMLGetAllAttribIndex($strXPath, ByRef $aName, ByRef $aValue[, $strQry = ""[, $iNodeIndex = 0]])
; Parameters ....: $strXpath - The xml tree path from root node (root/child/child..)
; $aNames - The array to return the attrib names in.
; $aValue - The array to return the attrib values in.
; $strQry - DOM compliant query string (not really necessary as it becomes
; $iNodeIndex - The index of node to retrieve.
; Return values .: Success - The number of elements.
; Failure - -1 and @error set to 1.
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLGetAllAttribIndex(ByRef $objDoc, $strXPath, ByRef $aName, ByRef $aValue, $strQry = "", $iNodeIndex = 0)
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLGetAllAttribIndex")
Return SetError(1, 23, -1)
EndIf
Local $objNodeList, $objQueryNodes, $i ;, $arrResponse[2][1]
$objQueryNodes = $objDoc.selectNodes($strXPath & $strQry)
If $objQueryNodes.length > 0 Then
$objNodeList = $objQueryNodes.item($iNodeIndex).attributes
_DebugWrite("GetAllAttribIndex " & $objNodeList.length)
;ReDim $arrResponse[2][$objNodeList.length + 1]
ReDim $aName[$objNodeList.length]
ReDim $aValue[$objNodeList.length]
For $i = 0 To $objNodeList.length - 1
;$arrResponse[0][$i] = $objNodeList.item ($i).nodeName
;$arrResponse[1][$i] = $objNodeList.item ($i).Value
$aName[$i] = $objNodeList.item($i).nodeName
$aValue[$i] = $objNodeList.item($i).Value
Next
;Return $arrResponse
Return $objNodeList.length
EndIf
_XMLError("Error retrieving attributes for: " & $strXPath & @CRLF)
Return SetError(1, 0, -1)
EndFunc ;==>_XMLGetAllAttribIndex
; #FUNCTION# ===================================================================
; Name ..........: _XMLGetPath
; Description ...: Return a nodes full path based on XPath input from root node.
; Syntax.........: _XMLGetPath($strXPath)
; Parameters ....: $strXPath - The XML tree path from root node (root/child/child..)
; Return values .: Success - An array of node names from root, count in [0] element.
; Failure - -1 and @error set to 1.
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLGetPath(ByRef $objDoc, $strXPath)
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLGetPath")
Return SetError(1, 24, -1)
EndIf
If $DOMVERSION < 4 Then
_XMLError("Error DOM Version: " & "MSXML Version 4 or greater required for this function")
Return SetError(1, 0, -1)
EndIf
Local $objNodeList, $arrResponse[1], $objNodeChild, $xmlerr, $nodepath, $ns
$objNodeList = $objDoc.selectNodes($strXPath)
If $objNodeList.length > 0 Then
_DebugWrite("GetPath list length:" & $objNodeList.length)
For $objNode In $objNodeList
Local $objNode1 = $objNode
$nodepath = ""
$nodepathtag = ""
If $objNode.nodeType <> $NODE_DOCUMENT Then
$ns = $objNode.namespaceURI()
If $ns <> "" Then
$ns = StringRight($ns, StringLen($ns) - StringInStr($ns, "/", 0, -1)) & ":"
EndIf
If $ns = 0 Then $ns = ""
$nodepath = "/" & $ns & $objNode.nodeName() & $nodepath
EndIf
Do
$objParent = $objNode1.parentNode()
_DebugWrite("parent " & $objParent.nodeName() & @LF)
If $objParent.nodeType <> $NODE_DOCUMENT Then
$ns = $objParent.namespaceURI()
If $ns <> "" Then
;$ns = StringRight($ns, StringLen($ns) - StringInStr($ns, "/", 0, -1)) & ":"
$ns &= ":"
EndIf
If $ns = 0 Then $ns = ""
$nodepath = "/" & $ns & $objParent.nodeName() & $nodepath
$objNode1 = $objParent
Else
$objNode1 = 0
EndIf
$objParent = 0
Until (Not (IsObj($objNode1)))
_DebugWrite("Path node> " & $nodepath & @LF)
_XMLArrayAdd($arrResponse, $nodepath)
Next
$arrResponse[0] = UBound($arrResponse) - 1
Return $arrResponse
EndIf
$xmlerr = @CRLF & "No matching node(s)found!"
_XMLError("Error Retrieving: " & $strXPath & $xmlerr)
Return SetError(1, 0, -1)
EndFunc ;==>_XMLGetPath

; #FUNCTION# ===================================================================
; Function Name : _XMLGetPathInternal
; Description ...: Returns the path of a valid node object.
; Syntax ........: _XMLGetPathInternal($objNode)
; Parameters ....: $objNode - A valid node object
; Return values .: Success - Path from root as string.
; Failure - An empty string and @error set to 1.
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLGetPathInternal($objNode)
If Not IsObj($objNode) Then
_XMLError("No object passed to function _XMLGetPathInternal")
Return SetError(1, 25, "")
EndIf
Local $nodepath, $na, $objParent
If IsObj($objNode) Then
$nodepath = "/" & $objNode.baseName
Do
$objParent = $objNode.parentNode()
_DebugWrite("parent" & $objParent.nodeName() & ">" & @LF)
If $objParent.nodeType <> $NODE_DOCUMENT Then
$ns = $objParent.namespaceURI()
If $ns = 0 Then $ns = ""
If $ns <> "" Then
$ns = StringRight($ns, StringLen($ns) - StringInStr($ns, "/", 0, -1)) & ":"
EndIf
$nodepath = "/" & $ns & $objParent.nodeName() & $nodepath
$objNode = $objParent
Else
$objNode = 0
EndIf
$objParent = 0
Until (Not (IsObj($objNode)))
_DebugWrite("Path node>" & $nodepath & @LF)
Return ($nodepath)
Else
Return SetError(1, 0, "")
EndIf
EndFunc ;==>_XMLGetPathInternal
; http://www.perfectxml.com/msxmlAnswers.asp?Row_ID=65
; #FUNCTION# ===================================================================
; Name ..........: _XMLReplaceChild
; Description ...: Replaces a node with another
; Syntax.........: _XMLReplaceChild($objOldNode, $objNewNode[, $ns = ""])
; Parameters ....: $objOldNode - The node to replace
; $objNewNode - The replacement node.
; Return values .: Success - 1.
; Failure - -1 and @error set to 1.
; Author ........: Stephen Podhajecki adapted from
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLReplaceChild(ByRef $objDoc,$objOldNode, $objNewNode, $ns = "")
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLReplaceChild")
Return SetError(1, 26, -1)
EndIf
If $objOldNode = "" Or $objNewNode = "" Then Return SetError(1)
Local $nodeRoot
Local $nodeOld
Local $nodeNew
Local $nodeTemp
Local $fSuccess = False
;No error handling done
With $objDoc
;;.Load "c:\books.xml"
$nodeRoot = .documentElement
$oldNodes = $nodeRoot.selectNodes($objOldNode)
;'For each Node
For $nodeOld In $oldNodes
;Create a New element
$nodeNew = .createNode($NODE_ELEMENT, $objNewNode, $ns)
;Copy attributes
For $nodeTemp In $nodeOld.Attributes
$nodeNew.Attributes.setNamedItem($nodeTemp.cloneNode(True))
Next
;Copy Child Nodes
For $nodeTemp In $nodeOld.childNodes
$nodeNew.appendChild($nodeTemp)
Next
;Replace with the renamed node
If IsObj($nodeOld.parentNode.replaceChild($nodeNew, $nodeOld)) Then $fSuccess = 1
If Not ($objDoc.parseError.errorCode = 0) Then
_XMLError("_XMLReplaceChild:" & @LF & "Error Replacing Child: " & _
$objDoc.parseError.errorCode & _
" " & $objDoc.parseError.reason)
$fSuccess = False
ExitLoop
Else
$fSuccess = True
EndIf
Next
.save($strFile)
EndWith
$nodeRoot = 0
$nodeOld = 0
$nodeNew = 0
$nodeTemp = 0
If ($fSuccess = False) Then Return SetError(1, 0, -1)
Return 1
EndFunc ;==>_XMLReplaceChild
; #FUNCTION# ===================================================================
; Name ..........: _XMLSchemaValidate
; Description ...: Validates a document against a dtd.
; Syntax.........: _XMLSchemaValidate($sXMLFile, $strNameSpc, $sXSDFile)
; Parameters ....: $sXMLFile - The file to validate
; $strNameSpc - xml namespace
; $sXSDFile - DTD file to validate against.
; Return values .: Success - 1
; Failure - -1 and @error set to 1.
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLSchemaValidate(ByRef $objDoc,$sXMLFile, $strNameSpc, $sXSDFile)
Local $cache, $xmldoc
$cache = ObjCreate("Msxml2.XMLSchemaCache." & $DOMVERSION & ".0")
If Not IsObj($cache) Then
MsgBox(266288, "XML Error", "Unable to instantiate the XML object" & @LF & "Please check your components.")
Return SetError(1, 0, -1)
EndIf
$cache.add($strNameSpc, $sXSDFile)
$xmldoc = ObjCreate("Msxml2.DOMdocument." & $DOMVERSION & ".0")
If Not IsObj($xmldoc) Then
MsgBox(266288, "XML Error", "Unable to instantiate the XML object" & @LF & "Please check your components.")
Return SetError(1, 0, -1)
EndIf
$xmldoc.async = False
$xmldoc.schemas = $cache
$xmldoc.load($sXMLFile)
If Not ($xmldoc.parseError.errorCode = 0) Then
_XMLError("_XMLSchemaValidate:" & @LF & "Error: " & $xmldoc.parseError.errorCode & " " & $xmldoc.parseError.reason)
Return SetError($xmldoc.parseError.errorCode)
EndIf
Return 1
EndFunc ;==>_XMLSchemaValidate
; #FUNCTION# ===================================================================
; Name ..........: _XMLGetDomVersion
; Description ...: Returns the version of msxml that is in use for the document.
; Syntax.........: _XMLGetDomVersion()
; Parameters ....: none
; Return values .: Success - msxml version
; Failure - 0
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLGetDomVersion()
Return $DOMVERSION
EndFunc ;==>_XMLGetDomVersion
; #FUNCTION# ===================================================================
; Name ..........: _XMLError
; Description ...: Sets or Gets error message that may be generated by the UDF functs.
; Syntax.........: _XMLError($sError = "")
; Parameters ....: $sError - Error message to set.
; Return values .: Success - one of the following:
; |$sError <> "" - Nothing.
; |$sError = "" - Last error set.
; Failure - Nothing.
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLError($sError = "")
If $sError = "" Then
$sError = $sXML_error
$sXML_error = ""
Return $sError
Else
$sXML_error = StringFormat($sError)
EndIf
_DebugWrite($sXML_error)
EndFunc ;==>_XMLError
; From the forum this came.
; #FUNCTION# ===================================================================
; Name ..........: _XMLCOMEerr
; Description ...: Displays a message box with the COM Error.
; Syntax.........: _XMLCOMEerr()
; Parameters ....: None
; Return values .:
; Author ........: SvenP 's error handler
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLCOMEerr()
_ComErrorHandler()
Return
EndFunc ;==>_XMLCOMEerr
; #FUNCTION# ===================================================================
; Name ..........: _ComErrorHandler
; Description ...: A COM error handling routine.
; Syntax.........: _ComErrorHandler($quiet = "")
; Parameters ....: $quiet - Work silently
; Return values .: None
; Author ........:
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _ComErrorHandler($quiet = "")
Local $COMErr_Silent, $HexNumber
; ==============================================================================
;added silent switch to allow the func returned to the option to display custom
;error messages
If $quiet = True Or $quiet = False Then
$COMErr_Silent = $quiet
$quiet = ""
EndIf
; ==============================================================================
$HexNumber = Hex($oXMLMyError.number, 8)
If @error Then Return
Local $msg = "COM Error with DOM!" & @CRLF & @CRLF & _
"err.description is: " & @TAB & $oXMLMyError.description & @CRLF & _
"err.windescription:" & @TAB & $oXMLMyError.windescription & @CRLF & _
"err.number is: " & @TAB & $HexNumber & @CRLF & _
"err.lastdllerror is: " & @TAB & $oXMLMyError.lastdllerror & @CRLF & _
"err.scriptline is: " & @TAB & $oXMLMyError.scriptline & @CRLF & _
"err.source is: " & @TAB & $oXMLMyError.source & @CRLF & _
"err.helpfile is: " & @TAB & $oXMLMyError.helpfile & @CRLF & _
"err.helpcontext is: " & @TAB & $oXMLMyError.helpcontext
If $COMErr_Silent <> True Then
MsgBox(0, @AutoItExe, $msg)
Else
_XMLError($msg)
EndIf
SetError(1)
EndFunc ;==>_ComErrorHandler
; simple helper functions
; #FUNCTION# ===================================================================
; Name ..........: _DebugWrite
; Description ...: Writes a message to console with a crlf on the end
; Syntax.........: _DebugWrite($strMsg[, $sLineEnding = @LF])
; Parameters ....: $strMsg - The message to display
; $sLineEnding - Line ending to add
; Return values .: On Succes - None.
; Failure - None.
; Author ........:
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _DebugWrite($strMsg, $sLineEnding = @LF)
If $fDEBUGGING Then
ConsoleWrite(StringFormat($strMsg) & $sLineEnding)
EndIf
EndFunc ;==>_DebugWrite
; #FUNCTION# ===================================================================
; Name ..........: _Notifier
; Description ...: displays a simple "ok" messagebox
; Syntax.........: _Notifier($Notifier_msg)
; Parameters ....: $Notifier_Msg - The message to display
; Return values .: On Succes - None.
; Failure - None.
; Author ........:
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _Notifier($Notifier_msg)
MsgBox(266288, @ScriptName, $Notifier_msg)
EndFunc ;==>_Notifier
; #FUNCTION# ===================================================================
; Name ..........: _SetDebug
; Description ...: Turn debugging info on or off
; Syntax.........: _SetDebug($fDbug = True)
; Parameters ....: $fDbug - Boolean value for debugging.
; Return values .: Success - The debugging state.
; Author ........:
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _SetDebug($fDbug = True)
$fDEBUGGING = $fDbug
_DebugWrite("Debug = " & $fDEBUGGING)
Return $fDEBUGGING
EndFunc ;==>_SetDebug
; #FUNCTION# ===================================================================
; Name ..........: _XMLUDFVersion
; Description ...: Returns UDF version number
; Syntax.........: _XMLUDFVersion()
; Parameters ....: None
; Return values .: Success - The UDF version number
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLUDFVersion()
Return $_XMLUDFVER
EndFunc ;==>_XMLUDFVersion
; #FUNCTION# ===================================================================
; Name ..........: _XMLTransform
; Description ...:
; Syntax.........: _XMLTransform([$oXMLDoc = ""[, $Style = ""[, $szNewDoc = ""]]])
; Parameters ....: $oXMLDoc - The document to transform
; $Style - The stylesheet to use
; $szNewDoc - Save to this file.
; Return values .: Success - Returns True
; Failure - -1 and @error set to 1.
; Author ........: Stephen Podhajecki , Modified by WeaponX
; Modified ......:
; Remarks .......: Default stylesheet is used for indenting.
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLTransform($oXMLDoc = "", $Style = "", $szNewDoc = "")
If $oXMLDoc = "" Then
$oXMLDoc = $objDoc
EndIf
If Not IsObj($oXMLDoc) Then
_XMLError("No object passed to function _XMLTransform")
Return SetError(1, 29, -1)
EndIf
Local $fIndented = False
Local $xslt = ObjCreate("MSXML2.XSLTemplate." & $DOMVERSION & ".0")
Local $xslDoc = ObjCreate("MSXML2.FreeThreadedDOMdocument." & $DOMVERSION & ".0")
Local $xmldoc = ObjCreate("MSXML2.DOMdocument." & $DOMVERSION & ".0")
Local $xslProc
$xslDoc.async = False
If FileExists($Style) Then
_DebugWrite("LoadXML:1:" & $xslDoc.load($Style) & @LF)
Else
_DebugWrite("LoadXML2:" & $xslDoc.loadXML(_GetDefaultStyleSheet()) & @LF)
EndIf
If $xslDoc.parseError.errorCode <> 0 Then
_XMLError("Error Transforming NodeToObject: " & $xslDoc.parseError.reason)
EndIf

$xslt.stylesheet = $xslDoc
$xslProc = $xslt.createProcessor()
$xslProc.input = $objDoc
$oXMLDoc.transformNodeToObject($xslDoc, $xmldoc)
If $oXMLDoc.parseError.errorCode <> 0 Then
_XMLError("_XMLTransform:" & @LF & "Error Transforming NodeToObject: " & $oXMLDoc.parseError.reason)
$fIndented = False
Else
$fIndented = True
EndIf
If $fIndented Then
;Write transformed xml to a file if a filename is given
If $szNewDoc <> "" Then
$xmldoc.save($szNewDoc)
If $xmldoc.parseError.errorCode <> 0 Then
_XMLError("_XMLTransform:" & @LF & "Error Saving: " & $xmldoc.parseError.reason)
$fIndented = False
EndIf
Else
;Overwrite original object with transformed object
$objDoc = $xmldoc
_XMLSaveDoc($strFile)
If $oXMLDoc.parseError.errorCode <> 0 Then
_XMLError("_XMLTransform:" & @LF & "Error Saving: " & $oXMLDoc.parseError.reason)
$fIndented = False
EndIf
EndIf
EndIf
$xslProc = 0
$xslt = 0
$xslDoc = 0
$xmldoc = 0
If $fIndented = False Then Return SetError(1, 0, -1)
Return $fIndented
EndFunc ;==>_XMLTransform
; #INTERNAL_USE_ONLY#==========================================================
; Name ..........: _GetDefaultStyleSheet
; Description ...: Internal function, returns the default indenting style sheet.
; Syntax.........: _GetDefaultStyleSheet()
; Parameters ....:
; Return values .: Success - The default stylesheet.
; Failure - Nothing.
; Author ........: Hew Wolff - Art & Logic, Inc.
; Modified ......:
; Remarks .......: Posted all over the web.
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _GetDefaultStyleSheet()

Return '' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'0' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
' ' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
' ' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
' ' & _
'' & _
'' & _
'' & _
'' & _
'' & _
' ' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'&#xA;' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
'' & _
''
EndFunc ;==>_GetDefaultStyleSheet
; #INTERNAL_USE_ONLY#==========================================================
; Name ..........: _AddFormat
; Description ...:
; Syntax.........: _AddFormat($objDoc[, $objParent = ""])
; Parameters ....: $objDoc - Document to format
; $objParent - Optional node to add formatting to
; Return values .: Success - 1
; Failure - -1 and @error set to 1.
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......: Just break up the tags, no indenting is done here.
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _AddFormat($objDoc, $objParent = "")
If $fADDFORMATTING = True Then
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLAddFormat")
Return SetError(1, 30, -1)
EndIf
$objFormat = $objDoc.createTextNode(@CR)
If IsObj($objParent) Then
$objParent.appendChild($objFormat)
Else
$objDoc.documentElement.appendChild($objFormat)
EndIf
_XMLSaveDoc($strFile)
EndIf
Return 1
EndFunc ;==>_AddFormat
; #FUNCTION# ===================================================================
; Name ..........: _XMLSetAutoSave
; Description ...: Set the automatic save to on or off
; Syntax.........: _XMLSetAutoSave($fSave = True)
; Parameters ....: $fSave - Boolean value to set automatic saving.
; Return values .: Success - Previous state of autosave.
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......: Defaults to true.
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLSetAutoSave($fSave = True)
Local $oldSave = $fXMLAUTOSAVE
$fXMLAUTOSAVE = Not $fXMLAUTOSAVE
Return $oldSave
EndFunc ;==>_XMLSetAutoSave

; #FUNCTION# ===================================================================
; Name ..........: _XMLSetAutoFormat
; Description ...: Turn auto formatting on or off
; Syntax.........: _XMLSetAutoFormat($fAutoFormat = True)
; Parameters ....: $fAutoFormat - Boolean flag for automatic formatting
; Return values .: Success - The previous state.
; Failure - Nothing.
; Author ........: Stephen Podhajecki {gehossafats at netmdc. com}
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLSetAutoFormat($fAutoFormat = True)
Local $oldFormat = $fADDFORMATTING
$fADDFORMATTING = $fAutoFormat
Return $oldFormat
EndFunc ;==>_XMLSetAutoFormat



; #FUNCTION# ===================================================================
; Name ..........: _XMLSaveDoc
; Description ...: Save the current xml doc
; Syntax.........: _XMLSaveDoc([$sFile=""[,$iForce = 0]])
; Parameters ....: $sFile - The filename to save the xml doc as.
; $iForce - If true, save the file regardless of autosave state.
; Return values .: Success - 1
; Failure - -1 and @error set to the following:
; |1 - error trying to save.
; |2 - Autosave is off.
; |3 - No filename given for save and default is blank.
; Author ........: Stephen Podhajecki {gehossafats at netmdc. com}
; Modified ......:
; Remarks .......: Defaults to the current filename.
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLSaveDoc(ByRef $objDoc,$sFile = "", $iForce = 0)
If ($fXMLAUTOSAVE = True) Or ($iForce = 1) Then
If $sFile = "" Then $sFile = $strFile
If $sFile <> "" Then
$objDoc.save($sFile)
If $objDoc.parseError.errorCode <> 0 Then
_XMLError("_XMLSaveDoc: Saving " & $sFile & " failed.:" & @LF & _
$objDoc.parseError.errorCode & _
" " & $objDoc.parseError.reason)
Return SetError(1, 0, -1)
EndIf
Return 1
Else
_XMLError("_XMLSaveDoc:" & " Error Saving: No Filename given")
Return SetError(3, 0, -1)
EndIf
EndIf
Return SetError(2, 0, 1)
EndFunc ;==>_XMLSaveDoc

; #FUNCTION# ===================================================================
; Name ..........: _XMLNodeExists
; Description ...: Checks for the existence of a node or nodes matching the specified path
; Syntax.........: _XMLNodeExists($strXPath)
; Parameters ....: $strXPath - Path to check for.
; Return values .: Success - 1 or Higher , 0
; Failure - 0 and @Error set to:
; |0 - No error.
; |1 - No XML object @extended = 31.
; |2 - Node not found.
; Author ........: Stephen Podhajecki
; Modified ......:
; Remarks .......: Returns the number of nodes found (could be greater than 1)
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLNodeExists(ByRef $objDoc,$strXPath)
If Not IsObj($objDoc) Then
_XMLError("No object passed to function _XMLNodeExists")
Return SetError(1, 31, 0)
EndIf
Local $objNode, $iCount
Local $objNode = $objDoc.SelectNodes($strXPath)
If IsObj($objNode) Then $iCount = $objNode.length
$objNode = 0
If $iCount Then Return $iCount
Return SetError(2, 0, 0)
EndFunc ;==>_XMLNodeExists

; #INTERNAL_USE_ONLY#==========================================================
; Name ..........: _XMLArrayAdd
; Description ...: Adds an item to an array.
; Syntax.........: _XMLArrayAdd(ByRef $avArray, $sValue)
; Parameters ....: $avArray - The array to modify.
; $sValue - The value to add to the array.
; Return values .: Success - 1 and value added to array.
; Failure - 0 and @error set to 1
; Author ........:
; Modified ......:
; Remarks .......: Local version of _ArrayAdd to remove dependency on Array.au3
; Related .......:
; Link ..........;
; Example .......; [yes/no]
; ==============================================================================
Func _XMLArrayAdd(ByRef $avArray, $sValue)
If IsArray($avArray) Then
ReDim $avArray[UBound($avArray) + 1]
$avArray[UBound($avArray) - 1] = $sValue
SetError(0)
Return 1
Else
SetError(1)
Return 0
EndIf
EndFunc ;==>_XMLArrayAdd

; #FUNCTION# =====================================================================
; Name ..........: _XMLGetParent
; Description ...: Gets the parent node name of the node pointed to by the XPath
; Syntax ........: _XMLGetParent($strXPath)
; Parameters ....: $strXPath - IN -
; Return values .:
; Author ........: Mike Rerick
; Modified.......:
; Remarks .......: Returns empty string if the XPath is not valid
; Related .......:
; Link ..........:
; Example .......: [yes/no]
; ================================================================================
Func _XMLGetParent($strXPath)
Local $objNodeList, $arrResponse[1], $objNodeChild, $xmlerr, $nodepath, $ns
Local $parentName = ""

If not IsObj($objDoc) then
_XMLError("No object passed to function _XMLGetParent")
Return SetError(1,24,-1)
EndIf

If $DOMVERSION < 4 Then
_XMLError("Error DOM Version: " & "MSXML Version 4 or greater required for this function")
Return SetError(1,0,-1)
EndIf

$objNodeList = $objDoc.selectNodes ($strXPath)
If $objNodeList.length > 0 Then
_DebugWrite("GetPath list length:" & $objNodeList.length)
For $objNode In $objNodeList
Local $objNode1 = $objNode
$nodepath = ""
$nodepathtag = ""
If $objNode.nodeType <> $NODE_DOCUMENT Then
$ns = $objNode.namespaceURI ()
If $ns <> "" Then
$ns = StringRight($ns, StringLen($ns) - StringInStr($ns, "/", 0, -1)) & ":"
EndIf
if $ns =0 then $ns =""
$nodepath = "/" & $ns & $objNode.nodeName () & $nodepath
EndIf

$objParent = $objNode1.parentNode ()
_DebugWrite("parent " & $objParent.nodeName () & @LF)
If $objParent.nodeType <> $NODE_DOCUMENT Then
$ns = $objParent.namespaceURI ()
If $ns <> "" Then
$ns &=":"
EndIf
if $ns =0 then $ns= ""
$nodepath = "/" &$ns & $objParent.nodeName ()& $nodepath
$objNode1 = $objParent
$parentName = $objParent.nodeName()
Else
$objNode1 = 0
EndIf
$objParent = 0
_DebugWrite("Path node> " & $nodepath & @LF)
_XMLArrayAdd($arrResponse, $nodepath)
Next

$arrResponse[0] = UBound($arrResponse) - 1
Return $parentName
EndIf

$xmlerr = @CRLF & "No matching node(s)found!"
_XMLError("Error Retrieving: " & $strXPath & $xmlerr)
SetError(1,0,-1)
Return $parentName
EndFunc ;==>_XMLGetParent

I don't quite get why would you post xmlwrap functions?

I am well aware of them and i also check them all out.

The problem is in name-space in my XML.

Share this post


Link to post
Share on other sites
agreiner

Problem is your xml is invalid.

<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:edp="http://mydocs/Documents/Schemas/EDP-Common-1.xsd" xmlns="http://mydocs/Documents/Schemas/schema_8.xsd">
<table>
<att08>
</table>
</att08>

Make it this:

<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:edp="http://mydocs/Documents/Schemas/EDP-Common-1.xsd" xmlns="http://mydocs/Documents/Schemas/schema_8.xsd">
<table>
<att08>
</att08>
</table>

Share this post


Link to post
Share on other sites
amakrkr

Problem is your xml is invalid.

<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:edp="http://mydocs/Documents/Schemas/EDP-Common-1.xsd" xmlns="http://mydocs/Documents/Schemas/schema_8.xsd">
<table>
<att08>
</table>
</att08>

Make it this:

<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:edp="http://mydocs/Documents/Schemas/EDP-Common-1.xsd" xmlns="http://mydocs/Documents/Schemas/schema_8.xsd">
<table>
<att08>
</att08>
</table>

thank you for correction but that is not the case. I have copied XML from a larger XML file and i wasnt careful with the structure.

Problem is that name_space needs a variable set like this:

$name_space = '"xmlns:test="[url="http://mydocs/Documents/Schemas/schema_8.xsd"]http://mydocs/Documents/Schemas/schema_8.xsd"[/url]'
_XMLFileOpen($file,$name_space)

Now if we select node from xml file it should look like this:

_XMLSelectNode("/test:Envelope/test:body/test:DOD_DDPO/test:Att08")
<- this will work (dont mind syntactical errors if any)

But now i want to create a node and here is the probem i need to do it like this:

_XMLCreateChildNode("/test:Envelope/test:body/test:DOD_DDPO/test:Att08","TableA")

this command will create node with attribute "xmlns":

<TableA xmlns=""/>

but actual output i am looking for is

</TableA>
Edited by amakrkr

Share this post


Link to post
Share on other sites
agreiner

What happens if you use _XMLCreateChildWAttr() and give it some attributes? Does it give you the proper start and end nodes (<TableA>,</TableA>)?

Share this post


Link to post
Share on other sites
amakrkr

No it doesnt it just adds attributes to tag <TableA xmlns=""/>

Share this post


Link to post
Share on other sites
jdelaney

No it doesnt it just adds attributes to tag <TableA xmlns=""/>

This is the preferred method if there is no .text on the node. ^

Only if there is text in the node, or child nodes, will the node split into TableA and closing /TableA

But what does that matter? If you use the dom object, they are equivalents.

If you absolutly need <TableA></TableA>, set the .text of the node = ""

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
amakrkr

This is the preferred method if there is no .text on the node. ^

Only if there is text in the node, or child nodes, will the node split into TableA and closing /TableA

But what does that matter? If you use the dom object, they are equivalents.

If you absolutly need <TableA></TableA>, set the .text of the node = ""

You still dont understand what is the problem.

Its not the problem in <TableA> ></TableA>

problem is nodi is generated with <TableA xmlns=""/> xmlns attribute and it shouldnt

it should be </TableA>

Share this post


Link to post
Share on other sites
jdelaney

problem is nodi is generated with <TableA xmlns=""/> xmlns attribute and it shouldnt

Not sure. You would have to crawl through the functions (never use them) to see when the attribute is added.

you could always grab the node object, then do node.removeAttribute('xmlns')

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
amakrkr

Impossible ... this is a large xml file i am parsing and to go troungh every created node with node.removeattribute?

Share this post


Link to post
Share on other sites
jdelaney

not impossible...maybe impracticle...you should find out where the UDF functions are "failing":

RecursiveRemoveAttribute($oXML.DocumentElement, "Count")
Func RecursiveRemoveAttribute ($oDomNode, $sAttributeToDelete)
 $oChildNodes = $oDomNode.ChildNodes
 For $oChildNode In $oChildNodes
  If $oChildNode.NodeType <> 1 Then ContinueLoop
  $oAttrib = $oChildNode.getAttributeNode ($sAttributeToDelete)
  If IsObj($oAttrib) Then $oChildNode.removeattributenode($oAttrib)
  If IsObj($oChildNode.ChildNodes) Then RecursiveRemoveAttribute($oChildNode,$sAttributeToDelete)
 Next
EndFunc

output prior to, then after calling the function:

<?xml version="1.0"?>
<items><Item0 Count="0"><Child0 Count="1"></Child0><Child1 Count="2"/><Child2 Count="3"></Child2><Child3 Count="4"/><Child4 Count="5"></Child4><Child5 Count="6"/></Item0><Item1 Count="7"><Child0 Count="8"></Child0><Child1 Count="9"/><Child2 Count="10"></Child2><Child3 Count="11"/><Child4 Count="12"></Child4><Child5 Count="13"/></Item1><Item2 Count="14"><Child0 Count="15"></Child0><Child1 Count="16"/><Child2 Count="17"></Child2><Child3 Count="18"/><Child4 Count="19"></Child4><Child5 Count="20"/></Item2><Item3 Count="21"><Child0 Count="22"></Child0><Child1 Count="23"/><Child2 Count="24"></Child2><Child3 Count="25"/><Child4 Count="26"></Child4><Child5 Count="27"/></Item3><Item4 Count="28"><Child0 Count="29"></Child0><Child1 Count="30"/><Child2 Count="31"></Child2><Child3 Count="32"/><Child4 Count="33"></Child4><Child5 Count="34"/></Item4><Item5 Count="35"><Child0 Count="36"></Child0><Child1 Count="37"/><Child2 Count="38"></Child2><Child3 Count="39"/><Child4 Count="40"></Child4><Child5 Count="41"/></Item5><Item6 Count="42"><Child0 Count="43"></Child0><Child1 Count="44"/><Child2 Count="45"></Child2><Child3 Count="46"/><Child4 Count="47"></Child4><Child5 Count="48"/></Item6><Item7 Count="49"><Child0 Count="50"></Child0><Child1 Count="51"/><Child2 Count="52"></Child2><Child3 Count="53"/><Child4 Count="54"></Child4><Child5 Count="55"/></Item7><Item8 Count="56"><Child0 Count="57"></Child0><Child1 Count="58"/><Child2 Count="59"></Child2><Child3 Count="60"/><Child4 Count="61"></Child4><Child5 Count="62"/></Item8><Item9 Count="63"><Child0 Count="64"></Child0><Child1 Count="65"/><Child2 Count="66"></Child2><Child3 Count="67"/><Child4 Count="68"></Child4><Child5 Count="69"/></Item9></items>
<?xml version="1.0"?>
<items><Item0><Child0></Child0><Child1/><Child2></Child2><Child3/><Child4></Child4><Child5/></Item0><Item1><Child0></Child0><Child1/><Child2></Child2><Child3/><Child4></Child4><Child5/></Item1><Item2><Child0></Child0><Child1/><Child2></Child2><Child3/><Child4></Child4><Child5/></Item2><Item3><Child0></Child0><Child1/><Child2></Child2><Child3/><Child4></Child4><Child5/></Item3><Item4><Child0></Child0><Child1/><Child2></Child2><Child3/><Child4></Child4><Child5/></Item4><Item5><Child0></Child0><Child1/><Child2></Child2><Child3/><Child4></Child4><Child5/></Item5><Item6><Child0></Child0><Child1/><Child2></Child2><Child3/><Child4></Child4><Child5/></Item6><Item7><Child0></Child0><Child1/><Child2></Child2><Child3/><Child4></Child4><Child5/></Item7><Item8><Child0></Child0><Child1/><Child2></Child2><Child3/><Child4></Child4><Child5/></Item8><Item9><Child0></Child0><Child1/><Child2></Child2><Child3/><Child4></Child4><Child5/></Item9></items>
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
amakrkr

;===============================================================================
; Function Name:    _XMLCreateChildNode
; Description:        Create a child node under the specified XPath Node.
; Parameter(s):        $path    Path from root
;                    $node    Node to add
; Syntax:            _XMLCreateChildNode($path,$node)
; Author(s):        Stephen Podhajecki <gehossafats@netmdc.com>
; Return Value(s)            on error set error to 1 and returns -1
;===============================================================================
Func _XMLCreateChildNode($strXPath, $strNode, $strData = "", $strNameSpc = "")
    If not IsObj($objDoc) then
        _XMLError("No object passed to function _XMLCreateChildNode")
        Return SetError(1,16,-1)
    EndIf
    Local $objParent, $objChild, $objNodeList
        $objNodeList = $objDoc.selectNodes ($strXPath)
        If IsObj($objNodeList) And $objNodeList.length > 0 Then
            For $objParent In $objNodeList
                If Not ($objParent.hasChildNodes ()) Then
                    _AddFormat($objDoc, $objParent)
                EndIf
                If $strNameSpc = "" Then
                    If Not ($objParent.namespaceURI = 0 Or $objParent.namespaceURI = "") Then $strNameSpc = $objParent.namespaceURI
                EndIf
                ConsoleWrite("$strNameSpc=" & $strNameSpc & @LF)
                $objChild = $objDoc.createNode ($NODE_ELEMENT, $strNode, $strNameSpc)
                If $strData <> "" Then $objChild.text = $strData
                $objParent.appendChild ($objChild)
                _AddFormat($objDoc, $objParent)
            Next
            If ($bXMLAUTOSAVE = True) Then $objDoc.save ($strFile)
            $objParent = ""
            $objChild = ""
            Return 1
        EndIf
    _XMLError("Error creating child node: " & $strNode & @CRLF & $strXPath & " does not exist." & @CRLF)
    Return SetError(1,0,-1)
EndFunc   ;==>_XMLCreateChildNode
;==================================

this is the function and i incline to fixing it before i go into another loop to remove those atributes.

Problem is i more and more I work with parsing XML files and autoit has some really nice and easy ways of dealing with XML files and i have to earn this stuff.

Share this post


Link to post
Share on other sites
jdelaney

Looks like this is doing it...if you pass in $strNameSpc = "", then the function checks if the parent has one, and populates the child with it:

If $strNameSpc = "" Then
                 If Not ($objParent.namespaceURI = 0 Or $objParent.namespaceURI = "") Then $strNameSpc = $objParent.namespaceURI
             EndIf

Func _XMLCreateChildNode($strXPath, $strNode, $strData = "", $strNameSpc = "")
If not IsObj($objDoc) then
     _XMLError("No object passed to function _XMLCreateChildNode")
     Return SetError(1,16,-1)
EndIf
Local $objParent, $objChild, $objNodeList
     $objNodeList = $objDoc.selectNodes ($strXPath)
     If IsObj($objNodeList) And $objNodeList.length > 0 Then
         For $objParent In $objNodeList
             If Not ($objParent.hasChildNodes ()) Then
                 _AddFormat($objDoc, $objParent)
             EndIf
             If $strNameSpc = "" Then
;                If Not ($objParent.namespaceURI = 0 Or $objParent.namespaceURI = "") Then $strNameSpc = $objParent.namespaceURI
             EndIf
             ConsoleWrite("$strNameSpc=" & $strNameSpc & @LF)
             $objChild = $objDoc.createNode ($NODE_ELEMENT, $strNode, $strNameSpc)
             If $strData <> "" Then $objChild.text = $strData
             $objParent.appendChild ($objChild)
             _AddFormat($objDoc, $objParent)
         Next
         If ($bXMLAUTOSAVE = True) Then $objDoc.save ($strFile)
         $objParent = ""
         $objChild = ""
         Return 1
     EndIf
_XMLError("Error creating child node: " & $strNode & @CRLF & $strXPath & " does not exist." & @CRLF)
Return SetError(1,0,-1)
EndFunc ;==>_XMLCreateChildNode

or, add a new bool to the function:

Func _XMLCreateChildNode($strXPath, $strNode, $strData = "", $strNameSpc = "", $bInheritNameSpc = False)
    If not IsObj($objDoc) then
        _XMLError("No object passed to function _XMLCreateChildNode")
        Return SetError(1,16,-1)
    EndIf
    Local $objParent, $objChild, $objNodeList
        $objNodeList = $objDoc.selectNodes ($strXPath)
        If IsObj($objNodeList) And $objNodeList.length > 0 Then
            For $objParent In $objNodeList
                If Not ($objParent.hasChildNodes ()) Then
                    _AddFormat($objDoc, $objParent)
                EndIf
                If $strNameSpc = "" Then
                    If Not ($objParent.namespaceURI = 0 Or $objParent.namespaceURI = "") And $bInheritNameSpc Then $strNameSpc = $objParent.namespaceURI
                EndIf
                ConsoleWrite("$strNameSpc=" & $strNameSpc & @LF)
                $objChild = $objDoc.createNode ($NODE_ELEMENT, $strNode, $strNameSpc)
                If $strData <> "" Then $objChild.text = $strData
                $objParent.appendChild ($objChild)
                _AddFormat($objDoc, $objParent)
            Next
            If ($bXMLAUTOSAVE = True) Then $objDoc.save ($strFile)
            $objParent = ""
            $objChild = ""
            Return 1
        EndIf
    _XMLError("Error creating child node: " & $strNode & @CRLF & $strXPath & " does not exist." & @CRLF)
    Return SetError(1,0,-1)
EndFunc   ;==>_XMLCreateChildNode
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
amakrkr

_XMLCreateChildNode("/test:Envelope/test:body/test:DOD_DDPO/test:Att08","TableA")

What if you changed this to

_XMLCreateChildNode("/test:Envelope/test:body/test:DOD_DDPO/test:Att08","TableA", "", " " )

Same thing now value is added to attribute.

Share this post


Link to post
Share on other sites
amakrkr

Looks like this is doing it...if you pass in $strNameSpc = "", then the function checks if the parent has one, and populates the child with it:

If $strNameSpc = "" Then
                 If Not ($objParent.namespaceURI = 0 Or $objParent.namespaceURI = "") Then $strNameSpc = $objParent.namespaceURI
             EndIf

Func _XMLCreateChildNode($strXPath, $strNode, $strData = "", $strNameSpc = "")
If not IsObj($objDoc) then
     _XMLError("No object passed to function _XMLCreateChildNode")
     Return SetError(1,16,-1)
EndIf
Local $objParent, $objChild, $objNodeList
     $objNodeList = $objDoc.selectNodes ($strXPath)
     If IsObj($objNodeList) And $objNodeList.length > 0 Then
         For $objParent In $objNodeList
             If Not ($objParent.hasChildNodes ()) Then
                 _AddFormat($objDoc, $objParent)
             EndIf
             If $strNameSpc = "" Then
;                If Not ($objParent.namespaceURI = 0 Or $objParent.namespaceURI = "") Then $strNameSpc = $objParent.namespaceURI
             EndIf
             ConsoleWrite("$strNameSpc=" & $strNameSpc & @LF)
             $objChild = $objDoc.createNode ($NODE_ELEMENT, $strNode, $strNameSpc)
             If $strData <> "" Then $objChild.text = $strData
             $objParent.appendChild ($objChild)
             _AddFormat($objDoc, $objParent)
         Next
         If ($bXMLAUTOSAVE = True) Then $objDoc.save ($strFile)
         $objParent = ""
         $objChild = ""
         Return 1
     EndIf
_XMLError("Error creating child node: " & $strNode & @CRLF & $strXPath & " does not exist." & @CRLF)
Return SetError(1,0,-1)
EndFunc ;==>_XMLCreateChildNode

or, add a new bool to the function:

Func _XMLCreateChildNode($strXPath, $strNode, $strData = "", $strNameSpc = "", $bInheritNameSpc = False)
If not IsObj($objDoc) then
     _XMLError("No object passed to function _XMLCreateChildNode")
     Return SetError(1,16,-1)
EndIf
Local $objParent, $objChild, $objNodeList
     $objNodeList = $objDoc.selectNodes ($strXPath)
     If IsObj($objNodeList) And $objNodeList.length > 0 Then
         For $objParent In $objNodeList
             If Not ($objParent.hasChildNodes ()) Then
                 _AddFormat($objDoc, $objParent)
             EndIf
             If $strNameSpc = "" Then
                 If Not ($objParent.namespaceURI = 0 Or $objParent.namespaceURI = "") And $bInheritNameSpc Then $strNameSpc = $objParent.namespaceURI
             EndIf
             ConsoleWrite("$strNameSpc=" & $strNameSpc & @LF)
             $objChild = $objDoc.createNode ($NODE_ELEMENT, $strNode, $strNameSpc)
             If $strData <> "" Then $objChild.text = $strData
             $objParent.appendChild ($objChild)
             _AddFormat($objDoc, $objParent)
         Next
         If ($bXMLAUTOSAVE = True) Then $objDoc.save ($strFile)
         $objParent = ""
         $objChild = ""
         Return 1
     EndIf
_XMLError("Error creating child node: " & $strNode & @CRLF & $strXPath & " does not exist." & @CRLF)
Return SetError(1,0,-1)
EndFunc ;==>_XMLCreateChildNode

I have tried that as well commenting out that line but still it produces same tag.

Share this post


Link to post
Share on other sites
amakrkr

Meh finally i have changed function to:

If $strNameSpc = "" Then
;~     If Not ($objParent.namespaceURI = 0 Or $objParent.namespaceURI = "") Then $strNameSpc = $objParent.namespaceURI
 $strNameSpc = $objParent.namespaceURI
EndIf

now it produces tag correctly.

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  

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.