如何解析和解释ant的build.xml

时间:2009-05-06 16:40:03

标签: java ant build classpath

是否有用于读取和ant build.xml并从中检索元素的Ant API?具体来说,我希望能够检索路径元素中的值,并能够遍历路径中的所有元素。

我的目的是检索给定路径并确保在清单中正确引用它,以便在产品投入生产时构建和清单匹配。

编辑:关于使用XML API的响应(并感谢他们),问题是当前构建的构建文件比这更复杂。即类路径引用不同的类路径并包含它,类路径中引用的元素本身在属性文件中定义,因此有太多的Ant API可以合理地重新创建。

4 个答案:

答案 0 :(得分:7)

您可以使用ProjectHelper类使用构建文件配置项目。如果要检查的路径包含在引用中,则可以通过其ID从项目中获取引用。

例如,如果您在build.xml中有这样的内容:

<path id="classpath">
    <fileset dir="${basedir}/lib" includes="*.jar"/>
</path>

然后,您可以使用以下代码获取Path引用:

import java.io.File;

import org.apache.tools.ant.Project;
import org.apache.tools.ant.ProjectHelper;
import org.apache.tools.ant.types.Path;

public class Test {
    public static void main(String[] args) throws Exception {    
        Project project = new Project();
        File buildFile = new File("build.xml");
        project.init();
        ProjectHelper.configureProject(project, buildFile);

        Path path = (Path) project.getReference("classpath");
     }
}

请注意,{1.6}中不推荐ProjectHelper.configureProject,但1.7中不推荐使用。

答案 1 :(得分:3)

有些时候我们需要在Ant脚本中解析xml文件来运行java文件或读取一些属性值,更像是这样。 这很简单,我们可以使用名为<xmlproperty>的标签来完成此操作。此标记加载xml文件,并在内部转换ant属性值中的xml文件的所有值,我们可以将这些值用作ant属性。例如

<root>
    <properties>
      <foo>bar</foo>
    </properties>
</root>

与ant脚本文件大致相当于: <property name="root.properties.foo" value="bar"/> 并且您可以使用$ {root.properties.foo}打印此值。

完整示例: 1.创建一个xml文件,说Info.xml 2.创建一个Ant脚本,如Check.xml

Info.xml

<?xml version="1.0" encoding="UTF-8"?>
<Students>

  <Student>
    <name>Binod Kumar Suman</name>
        <roll>110</roll>
    <city> Bangalore </city>
  </Student>


</Students>

Check.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="Check" default="init">
 <xmlproperty file="Info.xml" collapseAttributes="true"/>

<target name = "init">
  <echo> Student Name :: ${Students.Student.name} </echo>
  <echo> Roll :: ${Students.Student.roll} </echo>
  <echo> City :: ${Students.Student.city} </echo>
</target>

</project>

现在运行此(Check.xml)ant脚本后,您将获得输出

构建文件:C:\ XML_ANT_Workspace \ XML_ANT \ src \ Check.xml 在里面:      [echo]学生姓名:: Binod Kumar Suman      [echo] Roll :: 110      [echo]城市::班加罗尔 建立成功 总时间:125毫秒

这里非常简单,但是如果你在xml(StudentsInfo.xml)中有多个记录,那么它将以逗号分隔显示所有记录

构建文件:C:\ XML_ANT_Workspace \ XML_ANT \ src \ Check.xml 在里面:      [echo]学生姓名:: Binod Kumar Suman,Pramod Modi,Manish Kumar      [echo] Roll :: 110,120,130      [echo] City ::班加罗尔,日本,巴特那 建立成功 总时间:109毫秒

Link

答案 2 :(得分:2)

我认为没有可用的API,但由于您只对一个特定元素感兴趣,因此您只需编写一个脚本,该脚本只会拉出路径元素并检查它们。使用python中的SAX解析器应该相当容易。

from xml.sax import make_parser
from xml.sax.handler import ContentHandler 

def PathHandler(ContentHandler):
    def __init__(self):
        self._reading_path = False
        self._path = ""

    def start_element(self, name, attrs):
        if name == "path":
            self._reading_path = True

    def characters(self, ch):
        if self._reading_path:
            self._path += ch

    def end_element(self, name):
        if name == "path":
            self._reading_path = False
            #self._path is now populated with the contents of the path element

    @property
    def path(self):
        return self._path

handler = PathHandler()
parser = make_parser()
parser.setContentHandler(handler)
parser.parse("build.xml")

这将读取两个xml元素之间的任何文本节点。定制它以满足其他简单的XML解析要求应该相当容易。

答案 3 :(得分:0)

如果您只想检索特殊元素,请使用Java XML API。