Hi Sharon,

Thanks for your quick reply.
I am rather new to xml parsing ,so your help will be highly appreciated and
would be a time saver.

My intent is to parse the xml file get values from it and :
===========================================
The XML file is :


 * * <?xml version="1.0" encoding="utf-8" ?>
 *-* <file:///H:/config.xml#> <operating_system>
 *-* <file:///H:/config.xml#> <unix_80sp1>
 *-* <file:///H:/config.xml#> <tests type="*quick_sanity_test*">
 * * <prerequisitescript>*preparequicksanityscript*</prerequisitescript>
 * * <acbuildpath>*acbuildpath*</acbuildpath>
 * * <testsuitscript>*test quick sanity script*</testsuitscript>
 * * <testdir>*quick sanity dir*</testdir>
* * </tests>
 * * <machine_name>*u80sp1_L004*</machine_name>
 * * <machine_name>*u80sp1_L005*</machine_name>
 * * <machine_name>*xyz.pxy.dxe.cde*</machine_name>
 * * <vmware id="*155.35.3.55*">*144.35.3.90*</vmware>
 * * <vmware id="*155.35.3.56*">*144.35.3.91*</vmware>
* * </unix_80sp1>
* * </operating_system>

I want to parse the above file and collect
1.  All the machine_name in a list variable in a variable say mac_name
2.  All the vmware tag attributes in a list variable say vmware_attr and
corresponding values in another list variable say vmware_value

I am parsing the above in the function "parseXML" as mentioned below.

In doing so i was getting the following problems.

1. I was not able to get all the mach names in the list  variable mac_name ,
i only got the last one *xyz.pxy.dxe.cde*
*when i want all the three u80sp1_L004 u80sp1_L004 and xyz.pxy.dxe.cde.*
**
*But when i changed the xml file a little bit i could get all the values .*
**
*I had only one machine_name tag this way
<machine_name> u80sp1_L004,u80sp1_L004,xyz.pxy.dxe.cde<\machine_name>.  It
worked this way.*
**
*My question how : could i still parse it with three tags with same name.*
**
**
2. When i collect the three machine names and return it and try to get the
length i get error. (length = len(mach_name))

3. I am not sure how to get the vmware tag attributes and vmware tag values.


The code i am using is :

I think the code need to be modified a little bit to get the values
properly/ or even maybe the xml format to be modified to parse properly.


<?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>

        [vmware_value, mach_name,vmware_attr] = STAXResult

         length = len(mach_name)     /*any issue in using it this way, i get
error here*/

      </script>

      <log message="1">'vmware_value: %s' % (name)</log>
      <log message="1">'mach_name: %s' % (mach_name)</log>
      <log message="1">'vmware_attr: %s' % (vmware_attr)</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>
        vmware_attr = None
        mach_name = None
        vmware_value = None
        # 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):
                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):
                mach_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):
                name = thisChild.getNodeValue()

        # Get the text value for the element with tag name "vmware"
        nodeList = document.getElementsByTagName("vmware")
        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):
                vmware_value = thisChild.getNodeValue()
                vmware_attr  = thisChild.getNodeAttribure()  /* I GET ERROR
HERE ALSO ,NOT ABLE TO GET ATTR*/


      </script>
      <return>[vmware_attr,vmware_value, mach_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>

Regards
Sangram

On Fri, Jul 31, 2009 at 10:57 PM, Sharon Lucas <luc...@us.ibm.com> wrote:

>
> Sangram,
>
> I need more information as you didn't provide the contents of function
> "parseXML".  Perhaps it isn't returning what you think it is.  You should
> add more debugging to log the value of variable machine_name and its type.
>  Note that if the len() function works on PyStrings and PyList, so that's
> why it is important to understand what type of variable machine_name is, as
> well as what its value is.  Also, what is the complete error information
> that you are getting.  Note that it would be helpful to provide the complete
> STAX job so that we could run it to recreate the problem (e.g. you didn't
> provide function "parseXML" so I don't know what exactly it is returning).
>
> Change your STAX xml function to the following so that you can see what
> variable machine_name's value and type is and provide the log output and
> error information.
>
> <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">'type(machine_name)=%s' %
> (type(machine_name))</log>*
>       *<log message="1">'machine_name=%s' % (machine_name)</log>*
>
>       <script>length = len(machine_name)</script>
>       <log message="1">'len(machine_name)=%s' % (length)</log>
>
>       <log message="1">'Name: %s' % (name)</log>
>       <log message="1">'Machine_name: %s' % (machine_name)</log>
>     </sequence>
>   </function>
> </stax>
>
> --------------------------------------------------------------
> Sharon Lucas
> IBM Austin,   luc...@us.ibm.com
> (512) 286-7313 or Tieline 363-7313
>
>
>
>   *Sangram Bakshi <san...@gmail.com>*
>
> 07/31/2009 11:46 AM
>    To
> staf-users@lists.sourceforge.net  cc
>   Subject
> [staf-users] Error in using jython funtion len()
>
>
>
>
> Hi ,
>
>
> In the following stax job i am trying to read the length of a list
> machine_name.
> But i get syntax error while trying to do so . The code is highlighted in
> yellow.
>
> <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
>
>         length = len(machine_name)    ========> i am getting syntax error
> here ...is this a wrong way to do in this section?
>
>       </script>
>       <log message="1">'Name: %s' % (name)</log>
>       <log message="1">'Machine_name: %s' % (machine_name)</log>
>     </sequence>
>   </function>
> </stax>
>
> Regards
> Sangram
> ------------------------------------------------------------------------------
> Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
>
> trial. Simplify your report design, integration and deployment - and focus
> on
> what you do best, core application coding. Discover what's new with
> Crystal Reports now.
> http://p.sf.net/sfu/bobj-july_______________________________________________
> staf-users mailing list
> staf-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/staf-users
>
>
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
staf-users mailing list
staf-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/staf-users

Reply via email to