将xml属性解析为ant-build.xml文件

时间:2014-01-08 07:29:33

标签: java xml ant xml-parsing antbuilder

我有一个xml文件“versionreferance.xml”。下面是编码

<?xml version="1.0" encoding="utf-8"?>
<!-- Update "revision" value to -1 when the next build is intended to have its revision as 0. This needs to be done for patch/release builds-->
<BuildVersions>
  <property name="major" value="1" />
  <property name="minor" value="0" />
  <property name="patch" value="0" />
  <property name="revision" value="93" />
</BuildVersions>

另一个是我的ant-build.xml文件。

<?xml version="1.0" encoding="UTF-8"?>
<project name="xmlproperty-demo" default="init">
    <xmlproperty file="versionreferance.xml" collapseAttributes="true" />
        <echo>Major : ${BuildVersions.major}</echo>
        <echo>Minor : ${BuildVersions.minor}</echo>
        <echo>Patch : ${BuildVersions.patch}</echo>
        <echo>Revision : ${BuildVersions.revision}</echo>
</project>

我没有在输出中获得该值。

我想动态获取versionReference.xml的路径路径,它将与antbuild.xml位于不同的位置

开发\生成\ VersionReference.xml

开发\ Src \ JAAS API \ antbuild.xml

它应该是动态的。我可以从代码下面获取值。但它不是动态的。

<?xml version="1.0" encoding="UTF-8"?>
<project name="xmlproperty-demo" default="init">
    <xmlproperty file="C:\\Development\\Build\\versionreferance.xml" collapseAttributes="true" />
        <echo>Major : ${BuildVersions.major}</echo>
        <echo>Minor : ${BuildVersions.minor}</echo>
        <echo>Patch : ${BuildVersions.patch}</echo>
        <echo>Revision : ${BuildVersions.revision}</echo>
</project>

我想只以这种格式获取值。

<?xml version="1.0" encoding="utf-8"?>
<!-- Update "revision" value to -1 when the next build is intended to have its revision as 0.     This needs to be done for patch/release builds-->
<BuildVersions>
  <property name="major" value="1" />
  <property name="minor" value="0" />
  <property name="patch" value="0" />
  <property name="revision" value="93" />
</BuildVersions>

4 个答案:

答案 0 :(得分:2)

我强烈建议您使用免费的第三方XmlTask库:

的build.xml

<taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask" />
<xmltask>
    <fileset file="versionreferance.xml"/>
    <copy path="/BuildVersions/property[@name = 'major']/@value" property="BuildVersions.major"/>
    <copy path="/BuildVersions/property[@name = 'minor']/@value" property="BuildVersions.minor"/>
    <copy path="/BuildVersions/property[@name = 'patch']/@value" property="BuildVersions.patch"/>
    <copy path="/BuildVersions/property[@name = 'revision']/@value" property="BuildVersions.revision"/>
</xmltask>

<echo>Major : ${BuildVersions.major}</echo>
<echo>Minor : ${BuildVersions.minor}</echo>
<echo>Patch : ${BuildVersions.patch}</echo>
<echo>Revision : ${BuildVersions.revision}</echo>

输出

run:
     [echo] Major : 1
     [echo] Minor : 0
     [echo] Patch : 0
     [echo] Revision : 93

答案 1 :(得分:1)

如果在<echoproperties/>行之后添加<xmlproperty>,您应该看到属性已加载但未按预期加载。他们将是这样的:

BuildVersions.property=,,,
BuildVersions.property.name=major,minor,patch,revision
BuildVersions.property.value=1,0,0,93

这是因为属性基于节点名称,在您的情况下,您有四个&#34;属性的实例&#34;子节点不是唯一的。您最好的选择可能是更改xml,例如:

<BuildVersions>
    <major>1</major>
    ....
</BuildVersions>

答案 2 :(得分:1)

当您在xml文件中使用xmlproperty collapseAttributes="true"时,它会展平嵌套元素。

详细信息:https://ant.apache.org/manual/Tasks/xmlproperty.html

所以只说${BuildVersions.major}没有给出或打印值为1.因为你有相同的命名xml元素'prooerty'你将无法获得单一属性的值

例如,在您的情况下,${BuildVersions.property.name}将打印“major,minor,patch,revision

您可以重新设计versionreferance.xml以使xmlproperty正常工作。或者您可以将其作为属性文件&amp;说<property file="your.properties.file"/>&amp;将它们作为普通属性访问!

答案 3 :(得分:0)

如果 VersionReference.xml 与您在 antbuild.xml 对应的问题中提到的完全相同。

我建议你用“.. \ .. \ Build \ VersionReference.xml”改变你的绝对路径(如上所述),它对应于basedir =“。”在你的项目中

这应该可以正常工作。

考虑你的字符串格式要求。

我认为默认的逗号(,)分隔值可以替换为点(。)或根据您的要求通过以下语法进行操作

<propertyregex property="propB"
               input="${propA}"
               regexp=","
               replace="."
               global="true" />

请在此链接上找到更多信息: Replacing characters in Ant property

希望这有帮助。