Take the 2-minute tour ×

I have an XML file of the following form -

<map MAP_XML_VERSION="1.0">
    <entry key="database.user" value="user1"/>

Does ant have a native ability to read this and let me perform an xquery to pull back values for keys? Going through the API I did not see such capabilities.

share|improve this question

3 Answers 3

up vote 6 down vote accepted

You can use the scriptdef tag to create a JavaScript wrapper for your class. Inside JS, you pretty much have the full power of Java and can do any kind of complicated XML parsing you want.

For example:

<project default="build">        
    <target name="build">            
        <xpath-query query="//entry[@key='database.user']/@value"
                     xmlFile="test.xml" addproperty="value"/>
        <echo message="Value is ${value}"/>    

    <scriptdef name="xpath-query" language="javascript">
        <attribute name="query"/>
        <attribute name="xmlfile"/>
        <attribute name="addproperty"/>


            var exp = attributes.get("query");
            var filename = attributes.get("xmlfile");
            var input = new InputSource(new FileInputStream(filename));
            var xpath = XPathFactory.newInstance().newXPath();
            var value = xpath.evaluate(exp, input, XPathConstants.STRING);

            self.project.setProperty( attributes.get("addproperty"), value );


share|improve this answer
So far I definitely like this approach but I am running into an issue. At the evaluate call it hangs for 30-40 seconds, and I get a javax.script.ScriptException wrapping a javax.xml.xpath.XPathExpressionException. I get this even when I simplify the query to select the entire document. Any thoughts? –  PHeath Aug 10 '09 at 20:01
I'd have to see the XML you're working with and the xpath query. The sample above is only designed to select text elements. Its possible that you're trying to select a node or node set. –  Kevin Aug 10 '09 at 20:13
It should be returning the value of the attribute "value" of the element "entry". The xpath query is identical to what you put into the example there. The only thing I neglected to mention was there is a doctype (<!DOCTYPE map SYSTEM "java.sun.com/dtd/preferences.dtd">) and the standard xml header at the top. –  PHeath Aug 10 '09 at 20:19
I bet it's trying to resolve the preferences.dtd across the wire. –  Brian Agnew Aug 11 '09 at 8:21
Kudos to you Brian, that's exactly what the problem was. Question resolved. –  PHeath Aug 11 '09 at 12:54

The optional Ant task XMLTask is designed to do this. Give it an XPath expression and you can select the above into (say) a property. Here's an article on how to use it, with examples. It'll do tons of other XML-related manipulations/querying/creation as well.


<xmltask source="map.xml">
   <!-- copies to a property 'user' -->
   <copy path="/map/entry[@key='database.user']/@value" attrValue="true" property="user"/>

Disclaimer: I'm the author.

share|improve this answer

Sounds like you want something like ant-xpath-task. I'm not aware of a built-in way to do this with Ant.

share|improve this answer

Your Answer


