#format wiki #language en #pragma section-numbers off = Jython examples using Java XML classes = DocumentationAndEducation <<TableOfContents>> ---- Examples related to Java XML classes using Jython will be here. '''List of pages in this category:''' * Something simple using dom4j * Something else simple Jdom * Others ? * and of course Java SDK == Element tree == Here is a simple example. info on element tree is at http://effbot.org/zone/element-index.htm Download element tree from http://effbot.org/downloads/ {{{ from elementtree import ElementTree as ET root = ET.Element("html") head = ET.SubElement(root, "head") title = ET.SubElement(head, "title") title.text = "Page Title" body = ET.SubElement(root, "body") body.set("bgcolor", "#ffffff") body.text = "Hello, World!" tree = ET.ElementTree(root) tree.write("page.xhtml") import sys tree.write(sys.stdout) }}} which produces: {{{ <html><head><title>Page Title</title></head><body bgcolor="#ffffff">Hello, World!</body></html> }}} == dom4j == This example requires http://www.dom4j.org/ the example below was tested with v1.6.1 download it and put it in you classpath. This was posted to the Jython-users mailing list by Claude Falbriard Sep 14, 2007, This simply prints out a xml tree. change line 39 to a valid xml filename. {{{ import sys from org.dom4j.io import SAXReader def show_indent(level): return ' ' * level def show_node(node, level): """Display one node in the DOM tree. """ if node.getNodeType() == node.ELEMENT_NODE: name = node.getName() print '%sNode: %s' % (show_indent(level), name, ) attrs = node.attributes() for attr in attrs: aName = attr.getQualifiedName() aValue = attr.getValue() print ' %sAttr -- %s: %s' % (show_indent(level), aName,aValue,) if node.getName() == 'RefNum': val = node.getText() print '%stitle: "%s"' % (show_indent(level+1), val, ) elif node.getName() == 'link': val = node.getText() print '%slink : "%s"' % (show_indent(level+1), val, ) if node.getNodeType() == node.TEXT_NODE: print '**** text node' def show_tree(node, level): show_node(node, level) level1 = level + 1 children = node.elements() for child in children: show_tree(child, level1) def test(): print 'Version: %s' % (sys.version, ) reader = SAXReader() doc = reader.read('example.xml') root = doc.getRootElement() show_tree(root, 0) def main(): test() if __name__ == '__main__': main() }}} == Using Jython and jaxen XPath == From: Frank Cohen Sent: Tuesday, June 03, 2008 10:34 PM I needed to write a SOAP-based Web service to show off the SOAP testing capabilities for PushToTest TestMaker. I wanted to use XPath expressions to change the search expressions easily over time. I chose to use Jaxen and Xerces APIs. Figuring this out in Java wound up taking a long time - all those visits to change-compile-run-check land! So I broke out my trusty Jython (embedded in TestMaker) and wrote the following script. I like example code. So I am posting this here to help anyone else that needs to do XPath expressions. {{{ from java.io import ByteArrayInputStream from org.apache.axis.utils import XMLUtils from org.apache.axis.message import MessageElement from java.lang import String from org.jaxen.dom import DOMXPath mystring = '''<change_price_response> <Inventory> <Product number="1000"> <InStock> <part quantity="2" location="10"/> <part quantity="100" location="11"/> <part quantity="10" location="12"/> </InStock> <OnOrder> <order customer="100323" amount="2" ordernumber="988898"/> <order customer="100115" amount="1" ordernumber="988899"/> <order customer="100116" amount="10" ordernumber="988900"/> </OnOrder> <prices> <price amount="100" minquantity="1"/> <price amount="85" minquantity="10"/> <price amount="75" minquantity="20"/> </prices> </Product> </Inventory> </change_price_response>''' soapElementAsString = String( mystring ) myis = ByteArrayInputStream( soapElementAsString.getBytes() ) respdoc = XMLUtils.newDocument( myis ) myrq = '''<change_price> <Product number="1000"> <Operation type="AddStock" quantity="100" location="11"/> </Product> </change_price>''' soapElementAsString = String( myrq ) myis2 = ByteArrayInputStream( soapElementAsString.getBytes() ) rqdoc = XMLUtils.newDocument( myis2 ) #rqme = MessageElement( rqdoc.getDocumentElement() ) xpath1 = DOMXPath( "//Product" ) product_number = int( xpath1.selectSingleNode( rqdoc ).getAttribute("number") ) print "fc1", xpath1.selectSingleNode( rqdoc ).getClass().getName() xpath2 = DOMXPath( "//Operation[@location]" ) xpath2 = DOMXPath( "//Operation" ) print "fc", xpath2.selectSingleNode( rqdoc ).getClass().getName() quantity = int( xpath2.selectSingleNode( rqdoc ).getAttribute("quantity") ) location = int( xpath2.selectSingleNode( rqdoc ).getAttribute("location") ) print product_number, quantity, location xpath3 = DOMXPath( "//Product" ) xpath3.selectSingleNode( respdoc ).setAttribute( "number", str(product_number)) xpath4 = DOMXPath( '//part[@location=' + str( location ) + ']' ) xpath4.selectSingleNode( respdoc ).setAttribute( "quantity", str( quantity )) print "done" }}}