【问题标题】:How to parse and interpret ant's build.xml如何解析和解释ant的build.xml
【发布时间】:2010-10-24 06:02:47
【问题描述】:

是否有用于读取和 ant build.xml 并从中检索元素的 Ant API?具体来说,我希望能够检索路径元素中的值并能够遍历路径中的所有元素。

我的目的是检索给定路径并确保在清单中正确引用它,以便在产品投入生产时构建和清单匹配。

编辑:关于使用 XML API 的响应(并感谢他们),问题在于当前构建的构建文件比这更复杂。即类路径引用不同的类路径并包含它,并且类路径中引用的元素本身定义在属性文件中,因此有太多的 Ant API 无法合理地重新创建。

【问题讨论】:

    标签: java ant build classpath


    【解决方案1】:

    您可以使用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 中未弃用。

    【讨论】:

      【解决方案2】:

      有时我们需要在 Ant 脚本中解析 xml 文件来运行 java 文件或读取一些属性值等等。 这很容易,我们可以使用名为&lt;xmlproperty&gt; 的标签来做到这一点。该标签加载xml文件,并在内部将xml文件的所有值转换为ant属性值,我们可以将这些值用作ant属性。例如

      <root>
          <properties>
            <foo>bar</foo>
          </properties>
      </root>
      

      大致相当于这个放到 ant 脚本文件中为: &lt;property name="root.properties.foo" value="bar"/&gt; 你可以用 ${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>
      

      检查.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 [回声] 滚动 :: 110 [回声] 城市 :: 班加罗尔 构建成功 总时间:125 毫秒

      到这里为止非常简单,但是如果您在 xml (StudentsInfo.xml) 中有多个记录,那么它将显示所有记录,并以逗号分隔,如下所示

      构建文件:C:\XML_ANT_Workspace\XML_ANT\src\Check.xml 在里面: [echo] 学生姓名 :: Binod Kumar Suman,Pramod Modi,Manish Kumar [回声] 滚动 :: 110,120,130 [echo] 城市 :: Bangalore,Japan,Patna 构建成功 总时间:109 毫秒

      Link

      【讨论】:

        【解决方案3】:

        我认为没有可用的 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 解析要求。

        【讨论】:

          【解决方案4】:

          如果您只想检索特殊元素,请使用 Java XML API。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-17
            • 1970-01-01
            • 2019-01-20
            • 2012-07-31
            • 1970-01-01
            • 2015-08-06
            相关资源
            最近更新 更多