amakrkr Posted April 3, 2013 Share Posted April 3, 2013 (edited) 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 April 3, 2013 by amakrkr Link to comment Share on other sites More sharing options...
amakrkr Posted April 3, 2013 Author Share Posted April 3, 2013 expandcollapse popup#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' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ ' ' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ ' ' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ ' ' & _ '' & _ '' & _ '' & _ '' & _ '' & _ ' ' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '
' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' & _ '' 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. Link to comment Share on other sites More sharing options...
agreiner Posted April 3, 2013 Share Posted April 3, 2013 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> Link to comment Share on other sites More sharing options...
amakrkr Posted April 3, 2013 Author Share Posted April 3, 2013 (edited) 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 April 3, 2013 by amakrkr Link to comment Share on other sites More sharing options...
agreiner Posted April 3, 2013 Share Posted April 3, 2013 What happens if you use _XMLCreateChildWAttr() and give it some attributes? Does it give you the proper start and end nodes (<TableA>,</TableA>)? Link to comment Share on other sites More sharing options...
amakrkr Posted April 3, 2013 Author Share Posted April 3, 2013 No it doesnt it just adds attributes to tag <TableA xmlns=""/> Link to comment Share on other sites More sharing options...
jdelaney Posted April 3, 2013 Share Posted April 3, 2013 (edited) 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 /TableABut 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 April 3, 2013 by jdelaney IEbyXPATH-Grab IE DOM objects by XPATH IEscriptRecord-Makings of an IE script recorder ExcelFromXML-Create Excel docs without excel installed GetAllWindowControls-Output all control data on a given window. Link to comment Share on other sites More sharing options...
amakrkr Posted April 3, 2013 Author Share Posted April 3, 2013 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 /TableABut 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 shouldntit should be </TableA> Link to comment Share on other sites More sharing options...
jdelaney Posted April 3, 2013 Share Posted April 3, 2013 (edited) problem is nodi is generated with <TableA xmlns=""/> xmlns attribute and it shouldntNot 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 April 3, 2013 by jdelaney IEbyXPATH-Grab IE DOM objects by XPATH IEscriptRecord-Makings of an IE script recorder ExcelFromXML-Create Excel docs without excel installed GetAllWindowControls-Output all control data on a given window. Link to comment Share on other sites More sharing options...
amakrkr Posted April 3, 2013 Author Share Posted April 3, 2013 Impossible ... this is a large xml file i am parsing and to go troungh every created node with node.removeattribute? Link to comment Share on other sites More sharing options...
jdelaney Posted April 3, 2013 Share Posted April 3, 2013 (edited) 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 April 3, 2013 by jdelaney IEbyXPATH-Grab IE DOM objects by XPATH IEscriptRecord-Makings of an IE script recorder ExcelFromXML-Create Excel docs without excel installed GetAllWindowControls-Output all control data on a given window. Link to comment Share on other sites More sharing options...
amakrkr Posted April 3, 2013 Author Share Posted April 3, 2013 expandcollapse popup;=============================================================================== ; 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. Link to comment Share on other sites More sharing options...
jdelaney Posted April 3, 2013 Share Posted April 3, 2013 (edited) 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 April 3, 2013 by jdelaney IEbyXPATH-Grab IE DOM objects by XPATH IEscriptRecord-Makings of an IE script recorder ExcelFromXML-Create Excel docs without excel installed GetAllWindowControls-Output all control data on a given window. Link to comment Share on other sites More sharing options...
Danp2 Posted April 4, 2013 Share Posted April 4, 2013 _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", "", " " ) Latest Webdriver UDF Release Webdriver Wiki FAQs Link to comment Share on other sites More sharing options...
amakrkr Posted April 4, 2013 Author Share Posted April 4, 2013 _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. Link to comment Share on other sites More sharing options...
amakrkr Posted April 4, 2013 Author Share Posted April 4, 2013 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. Link to comment Share on other sites More sharing options...
amakrkr Posted April 4, 2013 Author Share Posted April 4, 2013 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. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now