Search code examples
javadomjython-2.5

How to iterate through the org.w3c.dom.NodeList using jython?


I'm using org.w3c.dom to process some xml documents. And I'm using jython 2.5.1 to implement it.

Part of my xml document (EmployeeInfo.xml) is like:

<employees>
    <employee id="1">
      <name>ABC</name>
      <title>Software Engineer</title>
    </employee> 
    <employee id="2">
      <name>DEF</name>
      <title>Systems Engineer</title>
    </employee>
    <employee id="3">
      <name>GHI</name>
      <title>QA Engineer</title>
    </employee>
    ......
</employees>

And my jython code for reading in and parsing xml is like:

import sys, logging
logging.basicConfig(level=logging.INFO)

from java.io import File
from javax.xml.parsers import DocumentBuilder
from javax.xml.parsers import DocumentBuilderFactory
from org.w3c.dom import Document
from org.w3c.dom import Element
from org.w3c.dom import Node
from org.w3c.dom import NodeList

// ... some code 

file = "C:/Users/Adminstrator/Doc/EmployeeInfo.xml"
doc = File(file)
if doc.exists():
    docFactory = DocumentBuilderFactory.newInstance()
    docFactory.setNamespaceAware(True)
    docBuilder = docFactory.newDocumentBuilder()

    if doc.endswith(".xml"):
        logging.info(" -- Reading " + doc)
        employeeDoc = docBuilder.parse(doc)

        if employeeDoc != None:
            employees = employeeDoc.getElementsByTagNameNS("*","employee")
            if employees != None:
                for employee in employees:
                    logging.info(employee.getChildNodes().getLength())
            else:
                logging.warn("Failed to get the employee from " + doc)
        else:
            logging.warn("Failed to parse the document " + doc)

else:
    logging.warn("Failed to find the specified document" + doc + ", please check the path!")

When I ran this script, there was an error:

TypeError: 'org.apache.xerces.dom.DeepNodeListImpl' object is not iterable

referring to the line:

for employee in employees:

It seems like it automatically treat the 'employees' as the jython's NodeList rather than org.w3c.dom.NodeList...

I searched online regarding this issue, but I've got little regarding this issue...Could anyone here help me with this? Thanks in advance!


Solution

  • I used the while loop to replace the for loop because it's rare to use the for(int i=0; i

    So I used:

    i = 0
    while i < employees.getLength:
        employee = employees.item(i)
        i = i + 1
    ....