""" Using the Apache XPath API from Jython Based on the the ApplyXPath.java example in the xalan distribution. Sean McGrath """ import sys import java from javax.xml.parsers import DocumentBuilderFactory from java.io import FileInputStream from java.io import OutputStreamWriter from org.apache.xpath import XPathAPI from org.w3c.dom import Document from org.w3c.dom import Node from org.w3c.dom.traversal import NodeIterator from org.xml.sax import InputSource from javax.xml.transform import Transformer, OutputKeys, TransformerFactory from javax.xml.transform.dom import DOMSource from javax.xml.transform.stream import StreamResult def DoXPath (Filename,XPathString): IS = InputSource (FileInputStream (Filename)) df = DocumentBuilderFactory.newInstance() df.setNamespaceAware(1) doc = df.newDocumentBuilder().parse(IS) serializer = TransformerFactory.newInstance().newTransformer() serializer.setOutputProperty (OutputKeys.OMIT_XML_DECLARATION, "yes") nl = XPathAPI.selectNodeIterator (doc,XPathString) n = nl.nextNode() while n: if IsTextNode (n): # Coalesce contiguous text nodes res = [n.getNodeValue()] nn = n.getNextSibling() while (nn): res.append (nn.getNodeValue()) nn = n.getNextSibling() java.lang.System.out (string.join(res,"")) else: serializer.transform (DOMSource(n), StreamResult (OutputStreamWriter (java.lang.System.out))) java.lang.System.out.println() n = nl.nextNode() def IsTextNode(n): return (n.getNodeType() in [Node.TEXT_NODE,Node.CDATA_SECTION_NODE]) if __name__ == "__main__": if len (sys.argv) != 3: sys.stderr.write ("Usage: %s filename xpath\n" % sys.argv[0]) else: DoXPath (sys.argv[1],sys.argv[2])