4

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

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

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

4

4 回答 4

8

您可以使用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");
     }
}

请注意,ProjectHelper.configureProject在 ant 1.6.2 中已弃用,但在 1.7 中不推荐使用。

于 2009-05-06T21:02:54.713 回答
3

有时我们需要在 Ant 脚本中解析 xml 文件以运行 java 文件或读取一些属性值等等。这很容易,我们可以使用名为<xmlproperty>. 该标签加载xml文件,并在内部将xml文件的所有值转换为ant属性值,我们可以将这些值用作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

信息.xml

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

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


</Students>

检查.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] City :: Bangalore BUILD SUCCESSFUL 总时间: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 :: Bangalore,Japan,Patna构建成功总时间:109 毫秒

关联

于 2009-06-21T18:04:29.210 回答
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 解析要求。

于 2009-05-06T16:53:48.543 回答
0

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

于 2009-05-06T16:57:57.377 回答