diff --git a/src/etc/testcases/taskdefs/xmlproperty.xml b/src/etc/testcases/taskdefs/xmlproperty.xml
new file mode 100644
index 000000000..457cfca95
--- /dev/null
+++ b/src/etc/testcases/taskdefs/xmlproperty.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/etc/testcases/taskdefs/xmlproperty_data.xml b/src/etc/testcases/taskdefs/xmlproperty_data.xml
new file mode 100644
index 000000000..d99951eb2
--- /dev/null
+++ b/src/etc/testcases/taskdefs/xmlproperty_data.xml
@@ -0,0 +1,4 @@
+
+ Text
+ false
+
diff --git a/src/main/org/apache/tools/ant/taskdefs/XmlProperty.java b/src/main/org/apache/tools/ant/taskdefs/XmlProperty.java
new file mode 100644
index 000000000..0c4219f67
--- /dev/null
+++ b/src/main/org/apache/tools/ant/taskdefs/XmlProperty.java
@@ -0,0 +1,247 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2002 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Ant", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * .
+ */
+
+package org.apache.tools.ant.taskdefs;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.FactoryConfigurationError;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+/**
+ * Task get property values from a valid xml file.
+ * Example:
+ *
+ * Text
+ * false
+ *
+ *
+ * root-tag(myattr)=true
+ * root-tag.inner-tag=Text
+ * root-tag.inner-tag(someattr)=val
+ * root-tag.a2.a3.a4=false
+ *
+ * @author Nicola Ken Barozzi
+ * @author Erik Hatcher
+ * @created 14 January 2002
+ */
+
+public class XmlProperty extends org.apache.tools.ant.Task {
+ private File src;
+ private String prefix = "";
+ private boolean keepRoot = true;
+ private org.w3c.dom.Document document;
+
+ /**
+ * Constructor.
+ */
+ public XmlProperty() {
+ super();
+ }
+
+ /**
+ * Initializes the task.
+ */
+
+ public void init() {
+ super.init();
+ }
+
+ /**
+ * Run the task.
+ * @exception org.apache.tools.ant.BuildException The exception raised during task execution.
+ */
+ public void execute()
+ throws org.apache.tools.ant.BuildException {
+ BufferedInputStream configurationStream = null;
+
+ try {
+ configurationStream =
+ new BufferedInputStream(new FileInputStream(src));
+
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+
+ factory.setValidating(false);
+ factory.setNamespaceAware(false);
+
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ document = builder.parse(configurationStream);
+
+ Element topElement = document.getDocumentElement();
+ NodeList topChildren = topElement.getChildNodes();
+ int numChildren = topChildren.getLength();
+
+ String prefixToUse = "";
+
+ if (!(prefix.equals(""))) {
+ prefixToUse = prefix;
+ }
+
+ log("Prefix to use 1: \"" + prefixToUse + "\"", Project.MSG_DEBUG);
+
+/*
+ if ((!(prefix.equals(""))) && keepRoot) {
+ prefixToUse += ".";
+ }
+
+ log("Prefix to use 2: \"" + prefixToUse + "\"", Project.MSG_DEBUG);
+
+ if (keepRoot) {
+ prefixToUse += (topElement.getNodeName());
+ }
+
+ log("Prefix to use 3: \"" + prefixToUse + "\"", Project.MSG_VERBOSE);
+*/
+ if (keepRoot) {
+ addNodeRecursively(topElement, prefixToUse, 0);
+ }
+ else {
+ for (int i = 0; i < numChildren; i++) {
+ addNodeRecursively(topChildren.item(i), prefixToUse, 0);
+ }
+ }
+
+ } catch (SAXException sxe) {
+ // Error generated during parsing
+ Exception x = sxe;
+ if (sxe.getException() != null)
+ x = sxe.getException();
+ throw new BuildException(x);
+
+ } catch (ParserConfigurationException pce) {
+ // Parser with specified options can't be built
+ throw new BuildException(pce);
+ } catch (IOException ioe) {
+ // I/O error
+ throw new BuildException(ioe);
+ } finally {
+ if (configurationStream != null) {
+ try {
+ configurationStream.close();
+ } catch (Exception e) {
+ }
+ }
+ }
+ }
+
+
+ void addNodeRecursively(org.w3c.dom.Node node, String prefix, int index) {
+
+ if (node.hasAttributes()) {
+ org.w3c.dom.NamedNodeMap nodeAttributes = node.getAttributes();
+ for (int i = 0; i < nodeAttributes.getLength(); i++) {
+ Node attributeNode = nodeAttributes.item(i);
+ String attributeName = prefix + (prefix.trim().equals("")?"":".") + node.getNodeName() + "(" + attributeNode.getNodeName() + ")";
+ String attributeValue = attributeNode.getNodeValue();
+ log(attributeName + ":" + attributeValue, Project.MSG_DEBUG);
+ project.setNewProperty(attributeName, attributeValue);
+ }
+ }
+
+ if (node.getNodeType() == Node.TEXT_NODE) {
+ String nodeText = node.getNodeValue();
+ if (nodeText.trim().length() != 0) {
+ log(prefix + ":" + nodeText, Project.MSG_DEBUG);
+ if (index == 0) {
+ project.setNewProperty(prefix, nodeText);
+ }
+
+ project.setNewProperty(prefix + "[" + String.valueOf(index) + "]", nodeText);
+ }
+ }
+
+ if (node.hasChildNodes()) {
+ prefix += ((prefix.trim().equals("")?"":".") + node.getNodeName());
+ org.w3c.dom.NodeList nodeChildren = node.getChildNodes();
+
+ int numChildren = nodeChildren.getLength();
+
+ StringBuffer childList = new StringBuffer();
+
+ for (int i = 0; i < numChildren; i++) {
+ if (i != 0) {
+ childList.append(",");
+ }
+ childList.append(node.getNodeName() + "[" + String.valueOf(index) + "]");
+ addNodeRecursively(nodeChildren.item(i), prefix, i);
+ }
+
+ project.setNewProperty(prefix + "[]", childList.toString());
+
+ }
+ }
+
+ public void setFile(File src) {
+ this.src = src;
+ }
+
+ public void setPrefix(String prefix) {
+ this.prefix = prefix.trim();
+ }
+
+ public void setKeeproot(boolean keepRoot) {
+ this.keepRoot = keepRoot;
+ }
+}
diff --git a/src/main/org/apache/tools/ant/taskdefs/defaults.properties b/src/main/org/apache/tools/ant/taskdefs/defaults.properties
index 960fd81cc..6149f4c71 100644
--- a/src/main/org/apache/tools/ant/taskdefs/defaults.properties
+++ b/src/main/org/apache/tools/ant/taskdefs/defaults.properties
@@ -21,6 +21,7 @@ replace=org.apache.tools.ant.taskdefs.Replace
java=org.apache.tools.ant.taskdefs.Java
tstamp=org.apache.tools.ant.taskdefs.Tstamp
property=org.apache.tools.ant.taskdefs.Property
+xmlproperty=org.apache.tools.ant.taskdefs.XmlProperty
taskdef=org.apache.tools.ant.taskdefs.Taskdef
ant=org.apache.tools.ant.taskdefs.Ant
exec=org.apache.tools.ant.taskdefs.ExecTask
diff --git a/src/testcases/org/apache/tools/ant/taskdefs/XmlPropertyTest.java b/src/testcases/org/apache/tools/ant/taskdefs/XmlPropertyTest.java
new file mode 100644
index 000000000..98d35d840
--- /dev/null
+++ b/src/testcases/org/apache/tools/ant/taskdefs/XmlPropertyTest.java
@@ -0,0 +1,82 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2002 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Ant", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * .
+ */
+
+package org.apache.tools.ant.taskdefs;
+
+import org.apache.tools.ant.BuildFileTest;
+
+/**
+ * @author Erik Hatcher
+ */
+public class XmlPropertyTest extends BuildFileTest {
+
+ public XmlPropertyTest(String name) {
+ super(name);
+ }
+
+ public void setUp() {
+ configureProject("src/etc/testcases/taskdefs/xmlproperty.xml");
+ }
+
+
+ public void testProperties() {
+ executeTarget("test");
+// System.out.println(this.getFullLog());
+ assertEquals("true", project.getProperty("root-tag(myattr)"));
+ assertEquals("Text", project.getProperty("root-tag.inner-tag"));
+ assertEquals("val", project.getProperty("root-tag.inner-tag(someattr)"));
+ assertEquals("false", project.getProperty("root-tag.a2.a3.a4"));
+ }
+
+}