XML DOM wrapper (COM)

752 posts in this topic

Posted (edited)

I've needed these for a while and didn't find any suitable so here's what I came up with.

_XMLDomWrapper.au3

Edit: Updated Version 03.07.2008 (Version 1.0.3.87) Total downloads: Posted Image

Edit: MDI Version 3.2.2006

I have moved most of my code to google code. and dispensed with the dynamic ip service.

Download here:

_XMLDomWrapper.au3

SVN code is here.

<div class='codetop'>CODE</div><div class='codemain' style='height:200px;overflow:auto'> _XMLCreateFile($sPath, $sRootNode, [$bOverwrite = False]) Creates an XML file with the given name and root.(Requires: #include <_XMLDomWrapper.au3>)

_XMLFileOpen($sXMLFile,[$sNamespace=""],[$ver=-1]) Creates an instance of an XML file.(Requires: #include <_XMLDomWrapper.au3>)

;==============================================================================

_XMLGetChildNodes ( strXPath ) Selects XML child Node(s) of an element based on XPath input from root node. (Requires: #include <_XMLDomWrapper.au3>)

_XMLGetNodeCount ( strXPath, strQry = "", iNodeType = 1 ) Get node count for specified path and type. (Requires: #include <_XMLDomWrapper.au3>)

_XMLGetPath ( strXPath ) Returns a nodes full path based on XPath input from root node. (Requires: #include <_XMLDomWrapper.au3>)

;==============================================================================

_XMLSelectNodes ( strXPath ) Selects XML Node(s) based on XPath input from root node. (Requires: #include <_XMLDomWrapper.au3>)

_XMLGetField ( strXPath ) Get XML Field(s) based on XPath input from root node.(Requires: #include <_XMLDomWrapper.au3>)

_XMLGetValue ( strXPath ) Get XML Field based on XPath input from root node. (Requires: #include <_XMLDomWrapper.au3>)

_XMLGetChildText ( strXPath ) Selects XML child Node(s) of an element based on XPath input from root node. (Requires: #include <_XMLDomWrapper.au3>)

_XMLUpdateField ( strXPath, strData ) Update existing node(s) based on XPath specs.(Requires: #include <_XMLDomWrapper.au3>)

_XMLReplaceChild ( objOldNode, objNewNode, ns = "" ) Replaces a node with a new node. (Requires: #include <_XMLDomWrapper.au3>)

;==============================================================================

_XMLDeleteNode ( strXPath ) Delete specified XPath node.(Requires: #include <_XMLDomWrapper.au3>)

_XMLDeleteAttr ( strXPath, strAttrib ) Delete attribute for specified XPath(Requires: #include <_XMLDomWrapper.au3>)

_XMLDeleteAttrNode ( strXPath, strAttrib ) Delete attribute node for specified XPath(Requires: #include <_XMLDomWrapper.au3>)

;==============================================================================

_XMLGetAttrib ( strXPath, strAttrib, strQuery = "" ) Get XML attribute based on XPath input from root node.(Requires: #include <_XMLDomWrapper.au3>)

_XMLGetAllAttrib ( strXPath, ByRef aName, ByRef aValue, strQry = "" ) Get all XML Field(s) attributes based on XPath input from root node.(Requires: #include <_XMLDomWrapper.au3>)

_XMLGetAllAttribIndex ( strXPath, ByRef aName, ByRef aValue, strQry = "", NodeIndex = 0 ) Get all XML Field(s) attributes based on Xpathn and specific index.(Requires: #include <_XMLDomWrapper.au3>)

_XMLSetAttrib ( strXPath, strAttrib, strValue = "" ) Set XML Field(s) attributes based on XPath input from root node.(Requires: #include <_XMLDomWrapper.au3>)

;==============================================================================

_XMLCreateCDATA ( strNode, strCDATA, strNameSpc = "" ) Create a CDATA SECTION node directly under root. (Requires: #include <_XMLDomWrapper.au3>)

_XMLCreateComment ( strNode, strComment ) Create a COMMENT node at specified path.(Requires: #include <_XMLDomWrapper.au3>)

_XMLCreateAttrib ( strXPath,strAttrName,strAttrValue="" ) Creates an attribute for the specified node. (Requires: #include <_XMLDomWrapper.au3>)

;==============================================================================

_XMLCreateRootChild ( strNode, strData = "", strNameSpc = "" ) Create node directly under root.(Requires: #include <_XMLDomWrapper.au3>)

_XMLCreateRootNodeWAttr ( strNode, aAttr, aVal, strData = "", strNameSpc = "" ) Create a child node under root node with attributes.(Requires: #include <_XMLDomWrapper.au3>)

_XMLCreateChildNode ( strXPath, strNode, strData = "", strNameSpc = "" ) Create a child node under the specified XPath Node.(Requires: #include <_XMLDomWrapper.au3>)

_XMLCreateChildWAttr ( strXPath, strNode, aAttr, aVal, strData = "", strNameSpc = "" ) Create a child node under the specified XPath Node with Attributes. (Requires: #include <_XMLDomWrapper.au3>)

;==============================================================================

_XMLSchemaValidate ( sXMLFile, ns, sXSDFile ) _XMLSchemaValidate($sXMLFile, $ns, $sXSDFile) Validate a document against a DTD. (Requires: #include <_XMLDomWrapper.au3>)

_XMLGetDomVersion ( ) Returns the XSXML version currently in use. (Requires: #include <_XMLDomWrapper.au3>)

_XMLError ( sError = "" ) Sets or Gets XML error message generated by XML functions.(Requires: #include <_XMLDomWrapper.au3>)

_XMLUDFVersion ( ) eturns the UDF Version number. (Requires: #include <_XMLDomWrapper.au3>)

_XMLTransform ( oXMLDoc, Style = "",szNewDoc="" ) Transfroms the document using built-in sheet or xsl file passed to function. (Requires: #include <_XMLDomWrapper.au3>)

_XMLNodeExists( $strXPath) Checks for the existence of the specified path. (Requires: #include <_XMLDomWrapper.au3>)</div>

Here's a sample prog to show some of its usefullness.

Its the gui sample from the /Examples/gui folder.

SaveSampleControls.au3

Works with newer wrapper :P

XmlExample.au3

_XMLExample.au3 downloads: Posted Image

The only thing I could not get to work was getting the checkbox state in the 2nd treeview.

Please give me some feedback.

Steve

Edit:

Bug Fix: _XMLGetField not returning array count.

Added Func _XMLSelectNodes($sXPath) returns a list of node names

Edit:

Corrected Def for _XMLGetAllAttrib

Edit:

Bugfix for _XMLCreateCDATA

Bugfix for _XMLGetValue returns array as supposed to.

Edit: June 29,2006

Added count to index[0] of the _XMLGetValue return

Change _XMLFileOpen _XMLFileCreate to look for available MSXML obj.

Added optional flag to _XMLFileCreate for specifiying UTF-8

Edit: March , Apr 2007

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.

Edit: Apr 24, 25 2007

Fixed _XMLCreateChileNodeWAttr() - Instead of removal, It points to the function that replaced it.

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.)

Edit: Jun 8, 2007

Fixed a namespace bug in _XMLCreateChildNode() and _XMLCreateChildNodeWAttr()

Edit: July 12, 2007

Changed version number displayed on this page to reflect latest version.

Edit: July 13, 2007

Fixed example script.

Edit: July 20, 2007

Fixed a bug where a failed _XMLFileOpen() return an empty object

Added an object check to applicable functions.

Edit: Aug 8, 2007

Added _XMLSetAutoSave() to turn off/on forced saving. -- Thanks drlava.

Added check for previous creation of COM error handler. --Thanks Lukasz Suleja

Edit: Aug 27, 2007

Changed order of properties created on file open to correct behaviour with namespaces.

Edit: Aug 31,2007

Fixed bug where _XMLUpdatedField would inadvertantly erase child nodes.

Edit: 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

Edit: Jan 05,2008

Fixed header documentation for _XMLGetAttrib. It returns the requested attribute if found. Not an array.

Edit: Feb 25,2008

Fixed dimensioning bug in _XMLGetChildren --Thanks oblique

Edit: Mar 05,2008

Return values fixed for the following functions: --Thanks oblique

_XMLFileOpen ,_XMLLoadXML,_XMLCreateFile

Documentation fixed for _XMLGetNodeCount,_XMLGetChildren --Thanks oblique

Edit: Mar 07,2008

Small changes.

Fixed an issue pointed out by lgr.

** latest version 1.0.3.87 ** Total downloads: Posted Image

I have moved most of my code to google code. and dispensed with the dynamic ip service.

Download here:

_XMLDomWrapper.au3

SVN code is here.

Edited by eltorro

Share this post


Link to post
Share on other sites



Posted

Great work! This has saved me alot of time and energy.

I have one suggestion though as your code not work correctly for the XML file that I am using. I have an XML file with the following data:

<?xml version="1.0"?>
<WORKBENCH_PROJECT>
  <Projects>
	<Project
	  UID="AJ95UX`/9_```#+&apos;=L0@!```?P```0" closed="false" active="true" approved="false"
	  start="2006-01-09T08:00:00" openForTimeEntry="true" format="0" trackMode="0" finish="2006-01-09T17:00:00"
	  priority="10" finishImposed="false" cpmType="0" name="Project1" startImposed="false"
	  program="false">
	  <Tasks>
		<Task
		  UID="1_AJ5\([`/5_```#+&apos;=L0@!```?P```0" start="2006-01-09T08:00:00" proxy="false" critical="false"
		  status="0" outlineLevel="1" finish="2006-01-09T17:00:00" summary="true" milestone="false"
		  name="first" fixed="false" locked="false" key="false" percComp="0.0" unplanned="false"/>
		<Task
		  UID="2_AJ?O93`?1_```#+&apos;=L0@!```?P```0" start="2006-01-09T08:00:00" proxy="false" critical="false"
		  status="0" outlineLevel="2" finish="2006-01-09T17:00:00" summary="false" milestone="false"
		  name="second" fixed="false" locked="false" key="false" percComp="0.0" unplanned="false"/>
	  </Tasks>
	</Project>
  </Projects>
</WORKBENCH_PROJECT>

As there are two TASK nodes under the TASKS node, I could not find any way to access the TASK nodes with your code, so I modified one the UDFs in your code such that I can select which of the nodes I wish to access by index instead of name. I have posted the code below. If your code allows you to do this, then let me know the error of my ways.

Func _XMLGetAllAttrib($strXPath, ByRef $aName, ByRef $aValue, $strQry = "", $NodeIndex = 0)
	Local $objNodeList, $objQueryNodes, $objNode, $arrResponse[2][1], $i, $i1

	$objQueryNodes = $objDoc.documentElement.selectNodes ($strXPath & $strQry)
	While @error = 0 And $objQueryNodes.length > 0
		$objNodeList = $objQueryNodes.item ($NodeIndex).attributes

		_DebugWrite("Get all attrib " & $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
	WEnd
;	_XMLError( "Error retrieving attributes for: " & $strXPath & @CRLF & $oMyError.windescription & @CRLF & $oMyError.scriptline)
	_XMLError( "Error retrieving attributes for: " & $strXPath & @CRLF)
	SetError(1)
	Return -1
;	EndIf
EndFunc  ;==>_XMLGetAllAttrib

Thank you again for you excellent work!

Share this post


Link to post
Share on other sites

Posted (edited)

Stumpii,

This will work with the code as is.

#include <_XMLDomWrapper.au3>
#include <Array.au3>

;_XMLFileOpen("C:\Program Files\AutoIt3\scripts\workbench_proj.xml")
$sXmlFile = FileOpenDialog("", @ProgramFilesDir & "\autoit", "XML (*.xml)", 1)
;ConsoleWrite($sXmlFile&@lf)
If @error Then
	MsgBox(4096, "File Open", "No file chosen")
	Exit
Else
	$oOXml = ""
	$oOXml = _XMLFileOpen ($sXmlFile)
	if @error then
			MsgBox(4096, "File Open Error", "Error Opening File.  Exiting program")
	Exit
	EndIf
EndIf

dim $aAttName[1],$aAttVal[1]

;get first node attribs  note: using optional query string
$ret = _XMLGetAllAttrib("/WORKBENCH_PROJECT/Projects/Project/Tasks/Task",$aAttName,$aAttVal,"[0]")
_ArrayDisplay($aAttName,"Task[0]"); show the names
_ArrayDisplay($aAttVal,"Task[0]"); show the values

dim $aAttName1[1],$aAttVa1l[1]
;get second node attribs note: XPath query string attached to path
;if one was to look at the code, the func just appends the optional query string to the path anyway.
$ret = _XMLGetAllAttrib("/WORKBENCH_PROJECT/Projects/Project/Tasks/Task[1]",$aAttName1,$aAttVal1)
_ArrayDisplay($aAttName1,"Task[1]")
_ArrayDisplay($aAttVal1,"Task[1]")

Edit: Does not work. Reuse of the same arrays allowed the value to show from the previous call.

;;get nodes based on a partial match. @ is for attribs.
;$ret = _XMLGetAllAttrib("/WORKBENCH_PROJECT/Projects/Project/Tasks/Task[@UID='2_AJ?*']",$aAttName,$aAttVal)
;_ArrayDisplay($aAttName,"Task[1]")
;_ArrayDisplay($aAttVal,"Task[1]")

give it a try.

You should also be able to use the following:

_XMLGetAllAttrib("/WORKBENCH_PROJECT/Projects/Project/Tasks/*[1]",$aAttName,$aAttVal)

Let me know. And thank you for posting.

I have added a couple of extra functs and I am going to re-work a couple of exisisting ones in the near future. The basic syntax and functionality should remain the same. I'll update the first post when I have completed it.

Edited by eltorro

Share this post


Link to post
Share on other sites

Posted

That's great. I will give it a try tonight.

Look forward to the new version!

Share this post


Link to post
Share on other sites

Posted

Update: working on a func that will return a node id or position based on the query.

supposedly

_XMLGetAllAttrib("/WORKBENCH_PROJECT/Projects/Project/Tasks/Task[starts-with(@UID,'2')]",$aAttName,$aAttVal)

should return true. But is doesn't.

Any Ideas?

Share this post


Link to post
Share on other sites

Posted

This works

_XMLGetAllAttrib("/WORKBENCH_PROJECT/Projects/Project/Tasks/Task[starts-with(@UID,2)]",$aAttName,$aAttVal)

Since is starts with a numeric value I guess the quotes around the 2 aren't necessary.

Share this post


Link to post
Share on other sites

Posted

I didn't get around to checking the code you suggested as I am on a different program with a different problem :lmao:

I am writing a prog that creates RSS feeds and the root node needs to be <rss version="2.0">. I tried to make this with the _XMLSetAttrib function, but as it requires a path from the root, I cannot find a way to access the root itself. What I ended up hacking in the code is adding attribute variables in the _XMLCreateFile function. This then allows you to set the attributes while creating the file.

Could you add this feature, or show the correct way to do it? Thanks, Stumpii

Share this post


Link to post
Share on other sites

Posted

I didn't get around to checking the code you suggested as I am on a different program with a different problem :lmao:

I am writing a prog that creates RSS feeds and the root node needs to be <rss version="2.0">. I tried to make this with the _XMLSetAttrib function, but as it requires a path from the root, I cannot find a way to access the root itself. What I ended up hacking in the code is adding attribute variables in the _XMLCreateFile function. This then allows you to set the attributes while creating the file.

Could you add this feature, or show the correct way to do it? Thanks, Stumpii

Sorry for the late reply :">

As far as I can tell an attribute cannot contain a space.

Try this code:

#include <_XMLDomWrapper.au3>
_XMLCreateFile(@scriptdir&"\RootAttrib.xml","Root",True)
_XMLFileOpen(@scriptdir&"\RootAttrib.xml")
_XMLCreateRootAttrib("rss_version","2.0")
Exit

func _XMLCreateRootAttrib($aAttr,$aVal)
$objChild = $objDoc.documentElement.Attributes.setNamedItem($objDoc.createAttribute ($aAttr))
$objChild.Value = $aVal
$objDoc.Save(@scriptdir&"\RootAttrib.xml")
EndFunc

eltorro

Share this post


Link to post
Share on other sites

Posted

Sorry for the late reply :">

As far as I can tell an attribute cannot contain a space.

eltorro

Sorry, didn't make myself clear. In <rss version="2.0">, rss is the root node name, version="2.0" is the attribute, so there is no problem with spaces. You code looks like it will do the trick in any case. Thanks!

Share this post


Link to post
Share on other sites

Posted

Sorry, didn't make myself clear. In <rss version="2.0">, rss is the root node name, version="2.0" is the attribute, so there is no problem with spaces. You code looks like it will do the trick in any case. Thanks!

Please let me know if you have any other troubles. I was hoping for more feedback so I could improve the functions.

Thanks. :lmao:

Share this post


Link to post
Share on other sites

Posted

First of all I would like to say Greatttttttt Jobbbbbbbbb..... I love this XML DOM wrapper......but as always I am not too sure how to use it.... :lmao:

Here is my question: (Please see the xml for refrence below)

So far I am able to update the OrderNumber, virtualTN, desiredDueDate.

I am having trouble updating base:LastName, base:B authorizationName, base:StreetName, etc...

Please Help....

Thanks in advance.

<?xml version="1.0" encoding="UTF-8"?>

<VoIPOrderRequest xmlns="werwerwerwre" xmlns:xsi="werwerwerwer" xmlns:base="werwerwer" xmlns:vBase="werwerwerwerw" xsi:schemaLocation="werwerwerr

file:/home/bsmedley/src/engr/project/voipgw/src/voipgw/DefaultWebApp/dtd/VoIPOrderRequest._v4.xsd">

<Header timeStamp="2003-06-25T22:17:55Z" authTok="werwerwerw" customerId="TEST"/>

<OrderNumber>******</OrderNumber>

<VoIPOrderType>

<vBase:ProvisionAndPort virtualTN="*********">

<vBase:VoIPInfo desiredDueDate="***********">

<vBase:Name>

<base:LastName>Last</base:LastName>

<base:CustomerTypeIndicator>

<base:B authorizationName="Some Auth Name"/>

</base:CustomerTypeIndicator>

</vBase:Name>

<vBase:Address>

<base:StreetName>Jacksonville</base:StreetName>

<base:City>City</base:City>

<base:State>NJ</base:State>

<base:ZIP>071111</base:ZIP>

<base:Country>US</base:Country>

</vBase:Address>

<vBase:Authorization>

<base:LOA successTimeStamp="2003-06-25T22:17:55Z"/>

</vBase:Authorization>

</vBase:VoIPInfo>

<vBase:VoIPPortInfo portBTN="11111111" currentServiceProvider="provider" currentAccountNumber="12345" clec="bo" clientAccountNumber="43210">

<vBase:PortBlock fromTN="11111111" toTN="1111">

<base:ListingTreatment>

<base:Keep/>

</base:ListingTreatment>

</vBase:PortBlock>

<vBase:PortDirection>

<base:WirelineToWireline/>

</vBase:PortDirection>

<vBase:PortType>

<vBase:P partialPortBTN="1111111111111"/>

</vBase:PortType>

</vBase:VoIPPortInfo>

</vBase:ProvisionAndPort>

</VoIPOrderType>

</VoIPOrderRequest>

Share this post


Link to post
Share on other sites

Posted

First of all I would like to say Greatttttttt Jobbbbbbbbb..... I love this XML DOM wrapper......but as always I am not too sure how to use it.... :lmao:

Here is my question: (Please see the xml for refrence below)

So far I am able to update the OrderNumber, virtualTN, desiredDueDate.

I am having trouble updating base:LastName, base:B authorizationName, base:StreetName, etc...

Please Help....

Thanks in advance.

<?xml version="1.0" encoding="UTF-8"?>

<VoIPOrderRequest xmlns="werwerwerwre" xmlns:xsi="werwerwerwer" xmlns:base="werwerwer" xmlns:vBase="werwerwerwerw" xsi:schemaLocation="werwerwerr

file:/home/bsmedley/src/engr/project/voipgw/src/voipgw/DefaultWebApp/dtd/VoIPOrderRequest._v4.xsd">

<Header timeStamp="2003-06-25T22:17:55Z" authTok="werwerwerw" customerId="TEST"/>

<OrderNumber>******</OrderNumber>

<VoIPOrderType>

<vBase:ProvisionAndPort virtualTN="*********">

<vBase:VoIPInfo desiredDueDate="***********">

<vBase:Name>

<base:LastName>Last</base:LastName>

<base:CustomerTypeIndicator>

<base:B authorizationName="Some Auth Name"/>

</base:CustomerTypeIndicator>

</vBase:Name>

<vBase:Address>

<base:StreetName>Jacksonville</base:StreetName>

<base:City>City</base:City>

<base:State>NJ</base:State>

<base:ZIP>071111</base:ZIP>

<base:Country>US</base:Country>

</vBase:Address>

<vBase:Authorization>

<base:LOA successTimeStamp="2003-06-25T22:17:55Z"/>

</vBase:Authorization>

</vBase:VoIPInfo>

<vBase:VoIPPortInfo portBTN="11111111" currentServiceProvider="provider" currentAccountNumber="12345" clec="bo" clientAccountNumber="43210">

<vBase:PortBlock fromTN="11111111" toTN="1111">

<base:ListingTreatment>

<base:Keep/>

</base:ListingTreatment>

</vBase:PortBlock>

<vBase:PortDirection>

<base:WirelineToWireline/>

</vBase:PortDirection>

<vBase:PortType>

<vBase:P partialPortBTN="1111111111111"/>

</vBase:PortType>

</vBase:VoIPPortInfo>

</vBase:ProvisionAndPort>

</VoIPOrderType>

</VoIPOrderRequest>

Try this.

I'm not real familiar with namespaces but the code below works with the xml in your post.

#Include <_XMLDomWrapper.au3>
_SetDebug(True);show debug messages via console write
$sXmlFile ="C:\Program Files\AutoIt3\scripts\voip.xml";******* put your path here.
If @error Then
	MsgBox(4096, "File Open", "No file chosen")
Else
	$oOXml = ""
	$oOXml = _XMLFileOpen($sXmlFile)
EndIf


;See here: http://www.xml.com/pub/a/2004/02/25/qanda.html
;Seems that one must not use the name space URI or explicitly reference it
dim $aAttrName[1],$aAttrValue[1]
$ret=_XMLGetField('//vBase:ProvisionAndPort/vBase:VoIPInfo/vBase:Name/base:LastName')
_ArrayDisplay($ret,"/VoIPOrderRequest/VoIPOrderType/ProvisionAndPort/VoIPInfo/Name/LastName")
Redim $aAttrName[1],$aAttrValue[1]
$ret=_XMLGetField('//vBase:ProvisionAndPort/vBase:VoIPInfo/vBase:Address/base:StreetName')
_ArrayDisplay($ret,"/VoIPOrderRequest/VoIPOrderType/ProvisionAndPort/VoIPInfo/Address/StreetName")
Redim $aAttrName[1],$aAttrValue[1]
$ret  =_XMLGetAllAttrib("//vBase:ProvisionAndPort/vBase:VoIPInfo/vBase:Authorization/base:LOA[@successTimeStamp]",$aAttrName,$aAttrValue)
_ArrayDisplay($aAttrName,"/VoIPOrderRequest/VoIPOrderType/ProvisionAndPort/VoIPInfo/Authorization/LOA")
_ArrayDisplay($aAttrValue,"/VoIPOrderRequest/VoIPOrderType/ProvisionAndPort/VoIPInfo/Authorization/LOA")
Exit

Hope this helps.

Try googling for Xpath and namespaces for more info.

Steve.

Share this post


Link to post
Share on other sites

Posted

Yessssss....It works!!!!....I figured out how to do _XMLUPDATEFIELD()...Thanks once again for the quick reply.

Share this post


Link to post
Share on other sites

Posted

I spoke to soon.... :lmao:

I am able to write to the fields perfectly where u see #####. Thanks to Steve. However how can I create the following if they dont exist in the xml?

1. <PortDirection><base:WirelineToWireline/></PortDirection> and <PortDirection><base:WirelineToWireless wirelessAcctNumber="" wirelessPIN="" wirelessSSN="111223333"/></PortDirection>

(Basically if its WirelineToWireline then leave it and if it is WirelineToWireless then add the items)

2. <PortType><F/></PortType> and <PortType><P partialPortBTN="1234561111"/></PortType>

(Basically if it is "F" then leave it and if it is "P" then add the field partialPortBTN)

Thanks in advance.

I am using the following XML:

<?xml version="1.0" encoding="UTF-8"?>

<VoIPOrderRequest xmlns="eee" xmlns:xsi="eee" xmlns:base="eee" xmlns:voipBase="eee" xsi:schemaLocation="eee file:/home/bsmedley/src/engr/project/voipgw/src/voipgw/DefaultWebApp/dtd/VoIPOrderRequest_v4.xsd">

<Header timeStamp="2003-06-25T22:17:55Z" authTok="eee" customerId="eee"/>

<OrderNumber>##########</OrderNumber>

<VoIPOrderType>

<PortOnly xmlns="eee">

<voipBase:VoIPInfo desiredDueDate="############">

<voipBase:Name>

<base:FirstName>############</base:FirstName>

<base:LastName>############</base:LastName>

<base:CustomerTypeIndicator>

<base:R/>

</base:CustomerTypeIndicator>

</voipBase:Name>

<voipBase:Address>

<base:StreetNumPrefix>##########</base:StreetNumPrefix>

<base:StreetNum>##########</base:StreetNum>

<base:StreetNumSuffix>##########</base:StreetNumSuffix>

<base:StreetPrefix>##########</base:StreetPrefix>

<base:StreetName>##########</base:StreetName>

<base:StreetType>##########</base:StreetType>

<base:StreetSuffix>##########</base:StreetSuffix>

<base:UnitInformation>##########</base:UnitInformation>

<base:SecondaryLocationDesignator>##########</base:SecondaryLocationDesignator>

<base:Room>##########</base:Room>

<base:Floor>##########</base:Floor>

<base:Building>##########</base:Building>

<base:City>##########</base:City>

<base:State>##########</base:State>

<base:ZIP>##########</base:ZIP>

<base:Country>##########</base:Country>

<base:EveningPhone>##########</base:EveningPhone>

<base:DaytimePhone>##########</base:DaytimePhone>

<base:EmailAddress>##########</base:EmailAddress>

<base:EmailAddress2>##########</base:EmailAddress2>

</voipBase:Address>

<voipBase:Authorization>

<base:LOA successTimeStamp="2005-11-01T22:17:55Z"/>

<!--<base:TPV pvn="XYZ" sentTimeStamp="2005-12-22T22:17:55Z"/>-->

</voipBase:Authorization>

</voipBase:VoIPInfo>

<VoIPPortInfo portBTN="##########" currentServiceProvider="##########" clec="##########" clientAccountNumber="##########" currentAccountNumber="##########">

<PortBlock fromTN="##########" toTN="##########">

<base:ListingTreatment><base:Keep/></base:ListingTreatment>

</PortBlock>

<PortDirection><base:WirelineToWireline/></PortDirection>

<!--<PortDirection><base:WirelineToWireless wirelessAcctNumber="" wirelessPIN="" wirelessSSN="111223333"/></PortDirection>-->

<PortType><F/></PortType>

<!--<PortType><P partialPortBTN="1234561111"/></PortType>-->

</VoIPPortInfo>

</PortOnly>

</VoIPOrderType>

</VoIPOrderRequest>

Share this post


Link to post
Share on other sites

Posted (edited)

Hi folks,

well i am kinda new and pretty much noob ;)

And sometimes i think o:):lmao: when i see some code,...

(i should really come to the point now.... sorry i am just a girl... i love eMotes :king: )

well... i have an XML-File and need a code which reads out some data of the XML-File and

put this data into variables (so i stupid one are able to work with it :"> )

The XML-File looks like this:

<drinks order="4593">

<drink id="1" prod="534" name="Milk" oid="361" dd="be_019" og_id="Drink" gid="Medium" avb="1"/>

<drink id="2" prod="635" name="Coffee" oid="132" dd="be_044" og_id="Drink" gid="Hot" avb="0"/>

<drink id="3" prod="157" name="Water" oid="173" dd="he_019" og_id="Drink" gid="Cold" avb="1"/>

</drinks>

the data i need is:

id, name, og_id, gid

and i have no idea how to make it,...

is there anyone who please help me and give me a example or something ?

(i guess i must use XML-DOM-wrapper somehow ?)

Thanks for helping,..

Br,

Andrea

Edited by AndreaKram

Share this post


Link to post
Share on other sites

Posted

Hi folks,

well i am kinda new and pretty much noob ;)

And sometimes i think o:):lmao: when i see some code,...

(i should really come to the point now.... sorry i am just a girl... i love eMotes :king: )

well... i have an XML-File and need a code which reads out some data of the XML-File and

put this data into variables (so i stupid one are able to work with it :"> )

The XML-File looks like this:

<drinks order="4593">

<drink id="1" prod="534" name="Milk" oid="361" dd="be_019" og_id="Drink" gid="Medium" avb="1"/>

<drink id="2" prod="635" name="Coffee" oid="132" dd="be_044" og_id="Drink" gid="Hot" avb="0"/>

<drink id="3" prod="157" name="Water" oid="173" dd="he_019" og_id="Drink" gid="Cold" avb="1"/>

</drinks>

the data i need is:

id, name, og_id, gid

and i have no idea how to make it,...

is there anyone who please help me and give me a example or something ?

(i guess i must use XML-DOM-wrapper somehow ?)

Thanks for helping,..

Br,

Andrea

Please post your xml, in order to provide u an example..

Share this post


Link to post
Share on other sites

Posted

Please post your xml, in order to provide u an example..

Hi DjDeep,

The XML-File has the following content.... i am not sure if it's standard-xml,..

whatever... so it looks like:

------------------ START ------------------

<drinks order="4593">

<drink id="1" prod="534" name="Milk" oid="361" dd="be_019" og_id="Drink" gid="Medium" avb="1"/>

<drink id="2" prod="635" name="Coffee" oid="132" dd="be_044" og_id="Drink" gid="Hot" avb="0"/>

<drink id="3" prod="157" name="Water" oid="173" dd="he_019" og_id="Drink" gid="Cold" avb="1"/>

</drinks>

------------------- END --------------------

only with more rows,...<drink id="4",...<drink id="5",..<drink id="6" and so on...

Thx,

Andrea

Share this post


Link to post
Share on other sites

Posted

Hi DjDeep,

The XML-File has the following content.... i am not sure if it's standard-xml,..

whatever... so it looks like:

------------------ START ------------------

<drinks order="4593">

<drink id="1" prod="534" name="Milk" oid="361" dd="be_019" og_id="Drink" gid="Medium" avb="1"/>

<drink id="2" prod="635" name="Coffee" oid="132" dd="be_044" og_id="Drink" gid="Hot" avb="0"/>

<drink id="3" prod="157" name="Water" oid="173" dd="he_019" og_id="Drink" gid="Cold" avb="1"/>

</drinks>

------------------- END --------------------

only with more rows,...<drink id="4",...<drink id="5",..<drink id="6" and so on...

Thx,

Andrea

Try this code to get you started:

#include <Array.au3>
#Include <_XMLDomWrapper.au3>
_SetDebug(True);show debug messages via console write
$sXmlFile ="C:\Program Files\AutoIt3\scripts\drink.xml";******* put your path here.
If @error Then
	MsgBox(4096, "File Open", "No file chosen")
Else
	$oOXml = ""
	$oOXml = _XMLFileOpen($sXmlFile)
EndIf
If Not IsObj($oOXml) then
	MsgBox(0,"Error","No Xml file.")
	Exit
EndIf

Dim $aAttrName[1], $aAttrValue[1], $node
for $x= 1 to 3
$node = _XMLGetAllAttrib ("//drinks/*["&$x-1&"]",$aAttrName,$aAttrValue ); by index, show all attribs. xml indexes are 0 based.

_ArrayDisplay($aAttrName,"Attrib Names")
_ArrayDisplay($aAttrValue,"Attrib Value")

$node = _XMLGetAttrib("//drinks/*["&$x-1&"]","name",'[@id='&$x&']'); select node by index  and where id = x
MsgBox(0,"Name Where Id="&$x,$node)
if @error then ExitLoop
Next
Exit

Hope this helps.

Steve

Share this post


Link to post
Share on other sites

Posted

I spoke to soon.... :lmao:

I am able to write to the fields perfectly where u see #####. Thanks to Steve. However how can I create the following if they dont exist in the xml?

1. <PortDirection><base:WirelineToWireline/></PortDirection> and <PortDirection><base:WirelineToWireless wirelessAcctNumber="" wirelessPIN="" wirelessSSN="111223333"/></PortDirection>

(Basically if its WirelineToWireline then leave it and if it is WirelineToWireless then add the items)

2. <PortType><F/></PortType> and <PortType><P partialPortBTN="1234561111"/></PortType>

(Basically if it is "F" then leave it and if it is "P" then add the field partialPortBTN)

Thanks in advance.

I am using the following XML:

<?xml version="1.0" encoding="UTF-8"?>

<VoIPOrderRequest xmlns="eee" xmlns:xsi="eee" xmlns:base="eee" xmlns:voipBase="eee" xsi:schemaLocation="eee file:/home/bsmedley/src/engr/project/voipgw/src/voipgw/DefaultWebApp/dtd/VoIPOrderRequest_v4.xsd">

<Header timeStamp="2003-06-25T22:17:55Z" authTok="eee" customerId="eee"/>

<OrderNumber>##########</OrderNumber>

<VoIPOrderType>

<PortOnly xmlns="eee">

<voipBase:VoIPInfo desiredDueDate="############">

<voipBase:Name>

<base:FirstName>############</base:FirstName>

<base:LastName>############</base:LastName>

<base:CustomerTypeIndicator>

<base:R/>

</base:CustomerTypeIndicator>

</voipBase:Name>

<voipBase:Address>

<base:StreetNumPrefix>##########</base:StreetNumPrefix>

<base:StreetNum>##########</base:StreetNum>

<base:StreetNumSuffix>##########</base:StreetNumSuffix>

<base:StreetPrefix>##########</base:StreetPrefix>

<base:StreetName>##########</base:StreetName>

<base:StreetType>##########</base:StreetType>

<base:StreetSuffix>##########</base:StreetSuffix>

<base:UnitInformation>##########</base:UnitInformation>

<base:SecondaryLocationDesignator>##########</base:SecondaryLocationDesignator>

<base:Room>##########</base:Room>

<base:Floor>##########</base:Floor>

<base:Building>##########</base:Building>

<base:City>##########</base:City>

<base:State>##########</base:State>

<base:ZIP>##########</base:ZIP>

<base:Country>##########</base:Country>

<base:EveningPhone>##########</base:EveningPhone>

<base:DaytimePhone>##########</base:DaytimePhone>

<base:EmailAddress>##########</base:EmailAddress>

<base:EmailAddress2>##########</base:EmailAddress2>

</voipBase:Address>

<voipBase:Authorization>

<base:LOA successTimeStamp="2005-11-01T22:17:55Z"/>

<!--<base:TPV pvn="XYZ" sentTimeStamp="2005-12-22T22:17:55Z"/>-->

</voipBase:Authorization>

</voipBase:VoIPInfo>

<VoIPPortInfo portBTN="##########" currentServiceProvider="##########" clec="##########" clientAccountNumber="##########" currentAccountNumber="##########">

<PortBlock fromTN="##########" toTN="##########">

<base:ListingTreatment><base:Keep/></base:ListingTreatment>

</PortBlock>

<PortDirection><base:WirelineToWireline/></PortDirection>

<!--<PortDirection><base:WirelineToWireless wirelessAcctNumber="" wirelessPIN="" wirelessSSN="111223333"/></PortDirection>-->

<PortType><F/></PortType>

<!--<PortType><P partialPortBTN="1234561111"/></PortType>-->

</VoIPPortInfo>

</PortOnly>

</VoIPOrderType>

</VoIPOrderRequest>

I think this is a limitation of the function. I hadn't anticipated namespaces as most of the stuff I work with doesn't use them. I changed the function below but haven't had a chance to test it.

;===============================================================================
; Function Name:	_XMLCreateChildNode
; Description:		Create a child node under the specified XPath Node.
; Parameters:		$path	Path from root
;					$node	Node to add
; Syntax:			_XMLCreateChildNode($path,$node)
; Author(s):		Stephen Podhajecki <gehossafats@netmdc.com>
; Returns:			on error set error to 1 and returns -1
;===============================================================================
Func _XMLCreateChildNode($strXPath, $strNode, $strData = "",$strValue="")
	Local $objParent, $objChild, $objNodeList
	While @error = 0
		$objNodeList = $objDoc.documentElement.selectNodes ($strXPath)
		If IsObj($objNodeList) Then;.length <> 0 Then
		   ;			For $objParent In $objNodeList.documentElement.selectNodes ($strXPath)
			For $objParent In $objNodeList
				$objChild = $objDoc.createNode (1, $strNode, $strValue)
				If $strData <> "" Then $objChild.text = $strData
				$objParent.appendChild ($objChild)
			Next
			$objDoc.Save ($strFile)
			$objParent = ""
			$objChild = ""
			Return
		Else
			ExitLoop
		EndIf
	WEnd
   ;	_XMLError( "Error creating child node: " & $strNode & @CRLF & $strXPath & " does not exist." & @CRLF & $oMyError.windescription)
	_XMLError( "Error creating child node: " & $strNode & @CRLF & $strXPath & " does not exist." & @CRLF)
	SetError(1)
	Return -1
EndFunc  ;==>_XMLCreateChildNode

I added an optional value where someone could enter the namespace.

Xmldoc.createNode("element","foo", "x-schema:fooSchema.xml")

so _XMLCreateChildNode(path,node,nodevalue,"x-schema:yourschema.xml")

Like I said I haven't had a chance to test it yet.

Pleae try it and see.

Steve

Share this post


Link to post
Share on other sites

Posted

Hi Steve,

Sorry for troubling u..but I am not able to create it:

<PortType><P partialPortBTN="1234561111"/></PortType>

Can u please post an example?

Share this post


Link to post
Share on other sites

Posted

Hi Steve,

Sorry for troubling u..but I am not able to create it:

<PortType><P partialPortBTN="1234561111"/></PortType>

Can u please post an example?

I messed with it for a while and there is a limitation to some of my function in that they aren't setup to take name space args.

Also, not knowing much about namespaces, I think that all the name spaces in the doc header need to be unique. I'll have to check on it to be sure.

see here and here.

The function to create a node with a namespace is obj.createNode(1,"Element","Namespace")

The function to create an attrib node with a namespace is obj.createAttribute("Name","Namespace")

The set the value of the attribute node just created and append it to the parent node.

In the case of the xml in your post all but one of your namespaces are something ="eee". You would use "eee" as your namespace arg. However, since there are several references to "eee" it may cause problems with MSXML. This I will have to check on. Also, I'll have to adjust the functs for namespaces. Namely the createRootNode(wAttrib), CreateChildNode(wAttrib) functions.

Right now I have to get ready to go. I won't be able to get to it until tommorrow sometime.

Steve

p.s.

I had updated a couple of other functions already, however, I am short on time at present.

I am looking at a newer version down the road as I see what other people are needing from the UDF.

Share this post


Link to post
Share on other sites

Posted

Please post your xml, in order to provide u an example..

Hmmm....

I'm struggling to figure out a way to step through an xml file and pull values out of a number of sections that look somewhat like this. I'm trying to pull out the tests= values from each section, then my plan is to dump them into a textfile and add them up.

First, I'm just not sure how to step through the xml file and pull out just the "tests" value for each section.

Any help would be awesome!

<testsuite errors="0" failures="0" name="test.com.test.1" tests="5" time="0.274">

<testcase classname="test.com.test.1" name="testGetSessionParmLong" time="0.0050" />

<testcase classname="test.com.test.1" name="testGetSessionParmString" time="0.0" />

<testcase classname="test.com.test.1" name="testChecked" time="0.0" />

<testcase classname="test.com.test.1" name="testParseBoolean" time="0.0" />

<testcase classname="test.com.test.1" name="testGetInitParam" time="0.0" />

<system-out />

<system-err />

</testsuite>

<testsuite errors="0" failures="0" name="test.com.test.2" tests="3" time="0.274">

<testcase classname="test.com.test.2" name="testGetSessionParmLong" time="0.0050" />

<testcase classname="test.com.test.2" name="testGetSessionParmString" time="0.0" />

<testcase classname="test.com.test.2" name="testChecked" time="0.0" />

<system-out />

<system-err />

</testsuite>

...

...

...

Thanks!

Max

Share this post


Link to post
Share on other sites

Posted

Hmmm....

I'm struggling to figure out a way to step through an xml file and pull values out of a number of sections that look somewhat like this. I'm trying to pull out the tests= values from each section, then my plan is to dump them into a textfile and add them up.

First, I'm just not sure how to step through the xml file and pull out just the "tests" value for each section.

Any help would be awesome!

<testsuite errors="0" failures="0" name="test.com.test.1" tests="5" time="0.274">

<testcase classname="test.com.test.1" name="testGetSessionParmLong" time="0.0050" />

<testcase classname="test.com.test.1" name="testGetSessionParmString" time="0.0" />

<testcase classname="test.com.test.1" name="testChecked" time="0.0" />

<testcase classname="test.com.test.1" name="testParseBoolean" time="0.0" />

<testcase classname="test.com.test.1" name="testGetInitParam" time="0.0" />

<system-out />

<system-err />

</testsuite>

<testsuite errors="0" failures="0" name="test.com.test.2" tests="3" time="0.274">

<testcase classname="test.com.test.2" name="testGetSessionParmLong" time="0.0050" />

<testcase classname="test.com.test.2" name="testGetSessionParmString" time="0.0" />

<testcase classname="test.com.test.2" name="testChecked" time="0.0" />

<system-out />

<system-err />

</testsuite>

...

...

...

Thanks!

Max

Try the following:
#include "C:\Program Files\AutoIt3\include\_XMLDomWrapper.au3"
_SetDebug (True);show debug messages via console write
;$sXmlFile = "C:\Program Files\AutoIt3\scripts\test.XML"
$sXmlFile = FileOpenDialog("", @ProgramFilesDir & "\autoit\scrpits", "XML (*.xml)", 1)
;ConsoleWrite($sXmlFile&@lf)
If @error Then
	MsgBox(4096, "File Open", "No file chosen")
	Exit
Else
	$oOXml = ""
	$oOXml = _XMLFileOpen ($sXmlFile)
EndIf
Dim $aAttrName[1], $aAttrValue[1], $node
$test = int(InputBox("Test","Enter test# to retrieve:"))
if IsInt($test) Then
   ; get all attribs where tests = ????
	$retval = _XMLGetAllAttrib("//testing/testsuite[@tests="&$test&"]",$aAttrName,$aAttrValue); get all attribs where tests = 5
	if IsArray($aAttrName) Then
		_ArrayDisplay($aAttrName,"Attrib Names")
		_ArrayDisplay($aAttrValue,"Attrib Values")
	Else
		msgbox(0,"Error","Test "&$test&" not found.")
		Exit
	EndIf

	Dim $aAttrName[1], $aAttrValue[1]
   ;get all attribs where tests = ??? and classname attrib name = "testGetSessionParmLong"
	$retval =	 _XMLGetAllAttrib('//testing/testsuite[@tests='&$test&']/testcase[@name="testGetSessionParmLong"]',$aAttrName,$aAttrValue)
	if IsArray($aAttrName) Then
	_ArrayDisplay($aAttrName,"Attrib Names")
	_ArrayDisplay($aAttrValue,"Attrib Values")
	Else
		msgbox(0,"Error","Test "&$test&" not found.")
		Exit
	EndIf
EndIf
Exit
#cs
<?xml version="1.0" encoding="UTF-8"?>
<testing>
<testsuite errors="0" failures="0" name="test.com.test.1" tests="5" time="0.274">
<testcase classname="test.com.test.1" name="testGetSessionParmLong" time="0.0050" />
<testcase classname="test.com.test.1" name="testGetSessionParmString" time="0.0" />
<testcase classname="test.com.test.1" name="testChecked" time="0.0" />
<testcase classname="test.com.test.1" name="testParseBoolean" time="0.0" />
<testcase classname="test.com.test.1" name="testGetInitParam" time="0.0" />
<system-out />
<system-err />
</testsuite>
<testsuite errors="0" failures="0" name="test.com.test.2" tests="3" time="0.274">
<testcase classname="test.com.test.2" name="testGetSessionParmLong" time="0.0050" />
<testcase classname="test.com.test.2" name="testGetSessionParmString" time="0.0" />
<testcase classname="test.com.test.2" name="testChecked" time="0.0" />
<system-out />
<system-err />
</testsuite>
</testing>
#ce

Steve.

Share this post


Link to post
Share on other sites

Posted

Try the following:

#include "C:\Program Files\AutoIt3\include\_XMLDomWrapper.au3"
_SetDebug (True);show debug messages via console write
;$sXmlFile = "C:\Program Files\AutoIt3\scripts\test.XML"
$sXmlFile = FileOpenDialog("", @ProgramFilesDir & "\autoit\scrpits", "XML (*.xml)", 1)
;ConsoleWrite($sXmlFile&@lf)
If @error Then
	MsgBox(4096, "File Open", "No file chosen")
	Exit
Else
	$oOXml = ""
	$oOXml = _XMLFileOpen ($sXmlFile)
EndIf
Dim $aAttrName[1], $aAttrValue[1], $node
$test = int(InputBox("Test","Enter test# to retrieve:"))
if IsInt($test) Then
  ; get all attribs where tests = ????
	$retval = _XMLGetAllAttrib("//testing/testsuite[@tests="&$test&"]",$aAttrName,$aAttrValue); get all attribs where tests = 5
	if IsArray($aAttrName) Then
		_ArrayDisplay($aAttrName,"Attrib Names")
		_ArrayDisplay($aAttrValue,"Attrib Values")
	Else
		msgbox(0,"Error","Test "&$test&" not found.")
		Exit
	EndIf

	Dim $aAttrName[1], $aAttrValue[1]
  ;get all attribs where tests = ??? and classname attrib name = "testGetSessionParmLong"
	$retval =	 _XMLGetAllAttrib('//testing/testsuite[@tests='&$test&']/testcase[@name="testGetSessionParmLong"]',$aAttrName,$aAttrValue)
	if IsArray($aAttrName) Then
	_ArrayDisplay($aAttrName,"Attrib Names")
	_ArrayDisplay($aAttrValue,"Attrib Values")
	Else
		msgbox(0,"Error","Test "&$test&" not found.")
		Exit
	EndIf
EndIf
Exit
#cs
<?xml version="1.0" encoding="UTF-8"?>
<testing>
<testsuite errors="0" failures="0" name="test.com.test.1" tests="5" time="0.274">
<testcase classname="test.com.test.1" name="testGetSessionParmLong" time="0.0050" />
<testcase classname="test.com.test.1" name="testGetSessionParmString" time="0.0" />
<testcase classname="test.com.test.1" name="testChecked" time="0.0" />
<testcase classname="test.com.test.1" name="testParseBoolean" time="0.0" />
<testcase classname="test.com.test.1" name="testGetInitParam" time="0.0" />
<system-out />
<system-err />
</testsuite>
<testsuite errors="0" failures="0" name="test.com.test.2" tests="3" time="0.274">
<testcase classname="test.com.test.2" name="testGetSessionParmLong" time="0.0050" />
<testcase classname="test.com.test.2" name="testGetSessionParmString" time="0.0" />
<testcase classname="test.com.test.2" name="testChecked" time="0.0" />
<system-out />
<system-err />
</testsuite>
</testing>
#ce

Steve.

Right on Steve, thanks for the reply.

Nice UI, but I'm not sure it's pulling out the right data for me.

What I'm trying to do is parse through the entire xml file and hit every <testsuite> section and just pull out the "tests=" value. If you see from the xml I posted, the first section has a "5", meaning 5 tests ran. The second <testsuite> has "3". There might be 20 or 50 more of these and I just want to extract that one value from each section.

any ideas?

thanks!

-max

Share this post


Link to post
Share on other sites

Posted

What I'm trying to do is parse through the entire xml file and hit every <testsuite> section and just pull out the "tests=" value. If you see from the xml I posted, the first section has a "5", meaning 5 tests ran. The second <testsuite> has "3". There might be 20 or 50 more of these and I just want to extract that one value from each section.

any ideas?

thanks!

-max

This may work for you

#include "C:\Program Files\AutoIt3\include\_XMLDomWrapper.au3"
_SetDebug (True);show debug messages via console write
;$sXmlFile = "C:\Program Files\AutoIt3\scripts\test.XML"
$sXmlFile = FileOpenDialog("", @ProgramFilesDir & "\autoit\scrpits", "XML (*.xml)", 1)
;ConsoleWrite($sXmlFile&@lf)
If @error Then
	MsgBox(4096, "File Open", "No file chosen")
	Exit
Else
	$oOXml = ""
	$oOXml = _XMLFileOpen ($sXmlFile)
EndIf
Dim $aAttrName[1], $aAttrValue[1], $node
; get all attribs where tests = ????
$retcnt1 = _XMLGetAllAttribNodeCount ('//testing/testsuite', "")
MsgBox(0, "Nodes", "Nodes: " & $retcnt1)
For $j = 0 To $retcnt1 - 1
	$retval = _XMLGetAllAttribIndex ("//testing/testsuite", $aAttrName, $aAttrValue, "", $j); get all attribs where tests = 5
	If IsArray($aAttrName) Then
		_ArrayDisplay($aAttrName, "Attrib Names")
		_ArrayDisplay($aAttrValue, "Attrib Values")
	Else
		MsgBox(0, "Error", "Test: no items not found.")
		Exit
	EndIf
Next
Exit
#cs
	<?xml version="1.0" encoding="UTF-8"?>
	<testing>
	<testsuite errors="0" failures="0" name="test.com.test.1" tests="5" time="0.274">
	<testcase classname="test.com.test.1" name="testGetSessionParmLong" time="0.0050" />
	<testcase classname="test.com.test.1" name="testGetSessionParmString" time="0.0" />
	<testcase classname="test.com.test.1" name="testChecked" time="0.0" />
	<testcase classname="test.com.test.1" name="testParseBoolean" time="0.0" />
	<testcase classname="test.com.test.1" name="testGetInitParam" time="0.0" />
	<system-out />
	<system-err />
	</testsuite>
	<testsuite errors="0" failures="0" name="test.com.test.2" tests="3" time="0.274">
	<testcase classname="test.com.test.2" name="testGetSessionParmLong" time="0.0050" />
	<testcase classname="test.com.test.2" name="testGetSessionParmString" time="0.0" />
	<testcase classname="test.com.test.2" name="testChecked" time="0.0" />
	<system-out />
	<system-err />
	</testsuite>
	</testing>
#ce

But you have to add this code to the _XMLDomWrapper.au3 to make it work

;===============================================================================
; Function Name:	_XMLGetAllAttribNodeCount
; Description:		Get Node Count based on XPath input from root node.
; Parameters:		$path	xml tree path from root node (root/child/child..)
;					[$query] DOM compliant query string  (not really necessary as it becomes
;part of the path
; Syntax:			_XMLGetAllAttribNodeCount($path,$query)
; Author(s):		Stephen Podhajecki <gehossafats@netmdc.com> & DickB
; Returns:			Number of Nodes found
;					on error set error to 1 and returns -1
;===============================================================================
Func _XMLGetAllAttribNodeCount($strXPath, $strQry = "")
	Local $objNodeList, $objQueryNodes, $objNode, $arrResponse[2][1], $i, $i1

	$objQueryNodes = $objDoc.documentElement.selectNodes ($strXPath & $strQry)
	If @error = 0 And $objQueryNodes.length > 0 Then
		Return $objQueryNodes.length
	EndIf
;	_XMLError( "Error retrieving attributes for: " & $strXPath & @CRLF & $oMyError.windescription & @CRLF & $oMyError.scriptline)
	_XMLError( "Error retrieving attributes for: " & $strXPath & @CRLF)
	SetError(1)
	Return -1
;	EndIf
EndFunc ;==>_XMLGetAllAttribNodeCount

I hope this works for you

Dick

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now




  • Recently Browsing   0 members

    No registered users viewing this page.