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