Hi Sangram
Using the Python string split function to split machine_name using a comma
worked fine for me. For example,
<function name="Main">
<sequence>
<!-- Assign the file name of a STAX xml document you want to parse
-->
<call function="'parseXML'">'c:/MyXml.xml'</call>
<script>
[name, machine_name] = STAXResult
machineList = machine_name.split(',')
</script>
<log message="1">'Name: %s' % (name)</log>
<log message="1">'machineList: %s' % (machineList)</log>
</sequence>
</function>
You said you got an error, but you didn't provide the error. You should
always provide the exact error that you're getting when asking a question
about why you are getting an error.
There appeared to be a couple of non-visible characters at the end of your
machine_name.split('.') line in the code you provided which possibly
caused the error you were seeing. Using the above function for me
produced the following expected results via the STAX Job Monitor
"Messages" panel:
20090407-11:32:48
Name: QuickSanity
20090407-11:32:48
Machine_name: 155.35.3.79,155.63.3.89,155.62.3.91
20090407-11:32:49
machineList: ['155.35.3.79', '155.63.3.89', '155.62.3.91']
--------------------------------------------------------------
Sharon Lucas
IBM Austin, luc...@us.ibm.com
(512) 286-7313 or Tieline 363-7313
Sangram Bakshi <san...@gmail.com>
04/07/2009 05:32 AM
To
Sharon Lucas/Austin/i...@ibmus
cc
staf-users@lists.sourceforge.net
Subject
Re: [staf-users] Parsing a XML file in a stax job.
Hi Sharon,
Thanks for the inputs , actually i am using xml as i am trying to take
inputs from a GUI , i take the input then write to the xml , then parse
this xml to get the values into the stax job.
Also i tried your inputs it parses and gets the value properly. Thanks.
I tried to parse the string machine_name which is returned after parsing
the xml file
MyXml.xml .
In <script>
[name, machine_name] = STAXResult
</script>
array_machine = machine_name.split(',')
and get them into array_machine[0] ..[1] [2] etc
inorder to get the individual ip adresses , but i am getting error using
this method of parsing .
Is there any other method to do so .I know this is not a STAX question ,
but it will save me time if i get some pointers.
Regards
Sangram
On Mon, Apr 6, 2009 at 11:22 PM, Sharon Lucas <luc...@us.ibm.com> wrote:
Note that this is not really a STAF or STAX question. This is simply a
question of how in Jython can I use a parse an xml file to get the values
for the text nodes for elements "name" and "machine_name".
Also, why are you using an xml file when instead you could simply use a
file that contains Python code to set the values for variables name and
machine_name? For example, you could simply create a file,
C:\myScriptFile.py, that contains:
name = 'QuickSanity'
machine_name = '155.35.3.79,155.63.3.89,155.62.3.91'
And then specify the name of this file as the value for the SCRIPTFILE
option on your STAX EXECUTE request (or similarly via the STAX Monitor).
For example:
STAF staxMachine STAX EXECUTE FILE "C:/yourStaxJob.xml' SCRIPTFILE
"C:/myScriptFile.py"
Then you would be able to reference Python variables name and machine_name
from within your STAX job with no xml parsing required.
But, in case you have a good reason for the data only being available in
an xml file, here's an example of a STAX job that parses your xml file and
gets the values for the "name" and "machine_name" elemenst in the xml
file.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "stax.dtd">
<stax>
<defaultcall function="Main"/>
<function name="Main">
<sequence>
<!-- Assign the file name of a STAX xml document you want to parse
-->
<call function="'parseXML'">'c:/MyXml.xml'</call>
<script>
[name, machine_name] = STAXResult
</script>
<log message="1">'Name: %s' % (name)</log>
<log message="1">'Machine_name: %s' % (machine_name)</log>
</sequence>
</function>
<!-- *******************************************************************
-->
<!-- Following function is used to parse an XML file and get the text
-->
<!-- values for the name and machine_name elements
-->
<!-- *******************************************************************
-->
<function name="parseXML" scope="local">
<function-list-args>
<function-required-arg name="xmlFileName">
Name of file containing XML to be parsed
</function-required-arg>
</function-list-args>
<sequence>
<!-- Parse the XML -->
<script>
factory = DocumentBuilderFactory.newInstance();
factory.setValidating(1)
factory.setIgnoringElementContentWhitespace(0)
builder = factory.newDocumentBuilder()
document = builder.parse(xmlFileName)
</script>
<script>
name = None
machine_name = None
# Get the text value for the element with tag name "name"
nodeList = document.getElementsByTagName("name")
for i in range(nodeList.getLength()):
node = nodeList.item(i);
if node.getNodeType() == Node.ELEMENT_NODE:
children = node.getChildNodes()
for j in range(children.getLength()):
thisChild = children.item(j)
if (thisChild.getNodeType() == Node.TEXT_NODE):
name = thisChild.getNodeValue()
# Get the text value for the element with tag name "machine_name"
nodeList = document.getElementsByTagName("machine_name")
for i in range(nodeList.getLength()):
node = nodeList.item(i)
if node.getNodeType() == Node.ELEMENT_NODE:
children = node.getChildNodes()
for j in range(children.getLength()):
thisChild = children.item(j)
if (thisChild.getNodeType() == Node.TEXT_NODE):
machine_name = thisChild.getNodeValue()
</script>
<return>[name, machine_name]</return>
</sequence>
</function>
<script>
# These imports only need to be done once per job, no matter
# how many xml documents are parsed
from java.io import File
from java.io import StringReader
from org.xml.sax import InputSource
from org.xml.sax import SAXParseException
from org.xml.sax.helpers import DefaultHandler
from javax.xml.parsers import DocumentBuilderFactory
from javax.xml.parsers import DocumentBuilder
from org.w3c.dom import Document
from org.w3c.dom import Element
from org.w3c.dom import Node
from org.w3c.dom import NodeList
</script>
</stax>
--------------------------------------------------------------
Sharon Lucas
IBM Austin, luc...@us.ibm.com
(512) 286-7313 or Tieline 363-7313
Sangram Bakshi <san...@gmail.com>
04/06/2009 08:01 AM
To
staf-users@lists.sourceforge.net
cc
Subject
[staf-users] Parsing a XML file in a stax job.
Hi ,
I am trying to parse a xml file and read values for it. For this i am
trying to use the DocumentBuilderFactory.
The xml i am trying to read is :
<?xml version='1.0' encoding='utf-8'?>
<Mydata>
<name>QuickSanity</name>
<machine_name>155.35.3.79,155.63.3.89,155.62.3.91</machine_name>
</Mydata>
I want to read the data in tag's <name> , <machine_name> (the array of ip
address ). I want to read these values and store them in
variables so that i can use them in my stax job later on.
I am parsing them this way:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "stax.dtd">
<stax>
<defaultcall function="Main"/>
<function name="Main">
<sequence>
<!-- Assign the file name of a STAX xml document you want to parse
-->
<call function="'parseXML'">'c:/MyXml.xml'</call>
<script>
document = STAXResult
<I am not sure sure how to use the document builder API to get the
xml files values here>
msg = '%s\nFound %s element ' % (msg,
root.getElementsByTagName("name"))
for i in range(children.getLength()):
thisChild = children.item(i);
if (thisChild.getNodeType() == Node.ELEMENT_NODE and
thisChild.getNodeName() == 'defaultcall'):
msg = '%s\nFound defaultcall element' % (msg)
elif thisChild.getNodeType() == Node.COMMENT_NODE:
# Do nothing
continue
elif thisChild.getNodeType() == Node.ELEMENT_NODE:
msg = '%s\nFound %s element ' % (msg,
thisChild.getNodeName())
</script>
<message>'Some parsed data: %s' % (msg)</message>
<log>'Some parsed data: %s' % (msg)</log>
</sequence>
</function>
<!-- *******************************************************************
-->
<!-- Following function is used to parse an XML file and return the DOM
-->
<!-- document object
-->
<!-- *******************************************************************
-->
<function name="parseXML" scope="local">
<function-list-args>
<function-required-arg name="xmlFileName">
Name of file containing XML to be parsed
</function-required-arg>
</function-list-args>
<sequence>
<!-- Parse the XML -->
<script>
factory = DocumentBuilderFactory.newInstance();
factory.setValidating(1)
factory.setIgnoringElementContentWhitespace(0)
builder = factory.newDocumentBuilder()
document = builder.parse(xmlFileName)
</script>
<return>document</return>
</sequence>
</function>
<script>
# These imports only need to be done once per job, no matter
# how many xml documents are parsed
from java.io import File
from java.io import StringReader
from org.xml.sax import InputSource
from org.xml.sax import SAXParseException
from org.xml.sax.helpers import DefaultHandler
from javax.xml.parsers import DocumentBuilderFactory
from javax.xml.parsers import DocumentBuilder
from org.w3c.dom import Document
from org.w3c.dom import Element
from org.w3c.dom import Node
from org.w3c.dom import NodeList
</script>
</stax>
------------------------------------------------------------------------------
_______________________________________________
staf-users mailing list
staf-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/staf-users
------------------------------------------------------------------------------
This SF.net email is sponsored by:
High Quality Requirements in a Collaborative Environment.
Download a free trial of Rational Requirements Composer Now!
http://p.sf.net/sfu/www-ibm-com
_______________________________________________
staf-users mailing list
staf-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/staf-users