一般的文本搜索替换操作,使用Ant中的<replace>任务就够用了,但在现代Java框架中,用户更可能需要强大的XML操作能力来修改servlet描述符、Spring配置等,就需要用到xmlTask了。
首先,在%ANT_HOME%\lib下添加xmltask.jar,下面为ant工程的目录结构图以及address.xml、address.properties、build.xml内容。
<!-- address.xml --> <?xml version="1.0" encoding="UTF-8" standalone="no"?> <a> <b> <address url="myURL">myaddress</address> </b> </a>
#address.properties address.url = localhost:8080 address.text = myaddressChange xml.location = ./source_folder
<?xml version="1.0" encoding="UTF-8"?> <project name="test" basedir="."> <taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask"/> <property file="address.properties"></property> <macrodef name="replaceXML"> <attribute name="replaceAttributeValue"/> <attribute name="replaceTextValue"/> <sequential> <xmltask source="${xml.location}/address.xml" dest="${xml.location}/address.xml"> <replace path="a/b/address/@url" withText="@{replaceAttributeValue}"/> <replace path="a/b/address/text()" withText="@{replaceTextValue}"/> </xmltask> </sequential> </macrodef> <replaceXML replaceAttributeValue="${address.url}" replaceTextValue="${address.text}" /> </project>
分析:
1. <taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask"/>: 使用xmltask检索xml,需要在ant_home\lib中加入xmltask.jar.
2.<macrodef name="replaceXML">...:相当于JAVA中的方法,<attribute name="replaceAttributeValue"/>相当于方法中的形式参数。
3. @{replaceAttributeValue}: 代表<macrodef>下的属性名为replaceAttributeValue的<attribute/>, 即<attribute name="replaceAttributeValue"/>。
4. @url::代表address节点下的url属性,即<address url="xxx"></address>。@...在xpath中定义就是为选取属性,这里xmltask延用xpath。
5. test(): 代表address节点下的值,即<address>xxx</address>
------------------------------------------------------------------------------------------------------------------------------
xmltask使用xpath查询,而xpath查询仅限于没有命名空间的xml(即没有xmlns属性),一旦遇到有命名空间的xml,对于xpath查询就会没有结果。
如上案例: 如果address.xml变为:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <a xmlns="xmlNameSpace"> <b> <address url="localhost:8080">myaddress</address> </b> </a>
此时使用xpath查询a/b会返回null,即找不到节点。
解决方案: 将build.xml中a/b/address替换成/*[local-name()='a']/*[local-name()='b']/*[local-name()='address']
<?xml version="1.0" encoding="UTF-8"?> <project name="test" basedir="."> <taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask"/> <property file="address.properties"></property> <macrodef name="replaceXML"> <attribute name="replaceAttributeValue"/> <attribute name="replaceTextValue"/> <sequential> <xmltask source="${xml.location}/address.xml" dest="${xml.location}/address.xml"> <replace path="/*[local-name()='a']/*[local-name()='b']/*[local-name()='address']/@url" withText="@{replaceAttributeValue}"/> <replace path="/*[local-name()='a']/*[local-name()='b']/*[local-name()='address']/text()" withText="@{replaceTextValue}"/> </xmltask> </sequential> </macrodef> <replaceXML replaceAttributeValue="${address.url}" replaceTextValue="${address.text}" /> </project>
相关推荐
属性值在任务中通过`${}`引用。 Ant提供多种内置任务,如: - `copy`:复制文件或目录。 - `delete`:删除文件或目录。 - `mkdir`:创建目录。 - `move`:移动文件或目录。 - `echo`:输出信息,支持message、file...
你可以将xmltask.jar放在Ant的lib目录下,或者在你的构建脚本中使用`<classpath>`元素指定它的位置。例如: ```xml ``` 接下来,我们需要在Ant的build.xml文件中引入XMLTask。使用`<taskdef>`元素定义一个名为...
- `-Dproperty=value`:设置属性值。 #### 四、构建文件(build.xml) Ant 的核心是 build.xml 文件,这是一个 XML 文件,定义了项目的构建过程。 ##### 4.1 Projects 元素 `<project>` 元素是构建文件的根节点,...
XMLtask是一款强大的Ant任务,它可以直接在XML文件中执行操作,比如插入、更新、删除或者复制元素。在Android开发中,XMLtask常被用来自动化处理Android项目的XML资源文件,如AndroidManifest.xml、build.gradle或者...
`property`元素用于设置属性值,如源代码和输出目录。`path`元素定义了类路径,`pathelement`是类路径中的一个条目。 `target`元素代表一个可执行的任务,比如`init`、`compile`和`dist`。`depends`属性指定目标...
### ant标签详解 #### 1. `<project>` 标签 `<project>` 标签是构建文件的基础,每一个构建文件都有一个对应的项目,并且此标签作为构建文件的根节点。`<project>` 标签支持多种属性: - **default**:指定构建...
2. **属性与属性文件**:Ant支持定义和使用属性,允许动态地配置值。属性可以通过`<property>`元素定义,并且可以在属性文件中进行集中管理,以提高可配置性。 3. **依赖关系**:通过`depends`属性,一个目标可以...
最后,FreeMarker的手册还包含了丰富的参考文档,其中包括内建函数的详细说明,这些函数包括用于字符串、数字、日期、布尔值、序列、哈希表和XML节点的内建函数。此外,指令参考文档部分详细描述了各种指令的用途和...
在给定的代码示例中,展示了如何使用StAX解析XML文件,查找并打印出Ant构建脚本中的所有目标。首先,创建一个`XMLEventReader`实例,指向XML文件,然后通过`nextEvent()`方法循环获取XML事件。当遇到开始元素事件(`...
在mapred-site.xml文件中,设置mapreduce.framework.name属性为yarn,表示使用YARN(Yet Another Resource Negotiator)作为作业调度器。 YARN的配置在yarn-site.xml中进行,这里主要设置ResourceManager和...
name是project节点常用的属性,也是必设且值唯一的属性,该属性的值会在整个CruiseControl系统使用,包括配置文件的${project.name}变量值。 3.2.轮询版本控制系统 版本库轮询机制是使用modificationset进行配置的...
- **4.9 和Ant一起使用FreeMarker**:指导如何在Ant构建脚本中使用FreeMarker。 - **4.10 Jython包装器**:介绍了一个用于Python语言的包装器。 #### 五、XML处理指南 这部分内容主要涵盖了FreeMarker如何处理XML...