【问题标题】:Parsing xml property to ant-build.xml file将 xml 属性解析为 ant-build.xml 文件
【发布时间】:2014-01-08 07:29:33
【问题描述】:

我有一个 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>

【问题讨论】:

    标签: java xml ant xml-parsing antbuilder


    【解决方案1】:

    我强烈建议使用免费的第三方 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
    

    【讨论】:

    • @Kaushalpanchal42 您可能需要将&lt;classpath&gt; 添加到指向xmltask JAR 文件的taskdef
    • @Chad Nouis 如何从 build.xml 迭代具有不同值的相同根命令??
    【解决方案2】:

    如果您在&lt;xmlproperty&gt; 行之后添加&lt;echoproperties/&gt;,您应该会看到属性已加载,但与您预期的不同。它们将类似于:

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

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

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

    【讨论】:

      【解决方案3】:

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

      详情:https://ant.apache.org/manual/Tasks/xmlproperty.html

      所以只是说 ${BuildVersions.major} 不会给出或打印值为 1。由于您具有相同的命名 xml 元素“prooerty”,因此您将无法获得单个属性的值

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

      您可以重新设计您的 versionreferance.xml 以尊重 xmlproperty 的工作。或者您可以将其作为属性文件并说&lt;property file="your.properties.file"/&gt; 并作为普通属性访问它们!

      【讨论】:

        【解决方案4】:

        如果 VersionReference.xml 正是您在问题中提到的与您的 antbuild.xml 相对应的位置。

        我建议您使用对应于 basedir="." 的 "..\..\Build\VersionReference.xml" 更改您的绝对路径(如问题中所述)。在你的项目中

        这应该可以正常工作。

        并考虑到您的字符串格式要求。

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

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

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

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-18
          • 2012-04-27
          • 2010-10-24
          • 2012-08-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多