是否有用于读取和ant build.xml并从中检索元素的Ant API?具体来说,我希望能够检索路径元素中的值,并能够遍历路径中的所有元素。
我的目的是检索给定路径并确保在清单中正确引用它,以便在产品投入生产时构建和清单匹配。
编辑:关于使用XML API的响应(并感谢他们),问题是当前构建的构建文件比这更复杂。即类路径引用不同的类路径并包含它,类路径中引用的元素本身在属性文件中定义,因此有太多的Ant API可以合理地重新创建。
答案 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毫秒
答案 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。