Question

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!

Was it helpful?

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

OTHER TIPS

org.apache.xerces.dom.DeepNodeListImpl This should work:

for (int i; i < employees.getLength(); i++) {
    Node employee = employees.item(i);
    ....
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top