2009-05-06 5 views
3

읽기 및 ant build.xml 및 요소 검색을위한 Ant API가 있습니까? 특히 경로 요소의 값을 검색하고 경로의 모든 요소를 ​​처리 할 수 ​​있기를 원합니다.ant의 build.xml을 구문 분석하고 해석하는 방법

제 목적은 지정된 경로를 검색하고 매니페스트에서 올바르게 참조되도록하여 제품이 프로덕션 환경으로 나가면 빌드와 매니페스트가 일치하도록하는 것입니다.

편집 : XML API를 사용하는 응답에 대해 (그리고 그들에게 감사드립니다.) 현재 빌드 된 빌드 파일은 그보다 더 복잡합니다. 즉, 클래스 경로가 다른 클래스 경로를 참조하고 클래스 경로에 참조 된 요소 자체가 속성 파일에 정의되므로 합리적으로 다시 작성하는 데 필요한 Ant API가 너무 많습니다.

답변

7

ProjectHelper 클래스를 사용하여 프로젝트를 빌드 파일로 구성 할 수 있습니다. 검사 할 경로가 참조에 포함되어 있으면 해당 ID로 프로젝트에서 참조를 얻을 수 있습니다. 예를 들어

, 당신이 당신의 build.xml이 같은 뭔가가있는 경우 : 개미에서 더 이상 사용되지 않습니다

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 것을 :

<path id="classpath"> 
    <fileset dir="${basedir}/lib" includes="*.jar"/> 
</path> 

그런 다음 다음과 같은 코드로 Path 참조를 얻을 수 있습니다 1.6.2, 1.7에서는 그렇지 않음.

+0

아주 멋진, 감사합니다! – Yishai

2

사용할 수있는 API가 없다고 생각합니다. 그러나 특정 요소에만 관심이 있기 때문에 경로 요소를 추출하고 검사하는 스크립트를 작성할 수 있습니다. 파이썬에서 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 구문 분석 요구 사항을 충족 시키려면 사용자 정의가 매우 쉽습니다.

0

특수 요소 만 검색하려는 경우 Java XML API를 사용하십시오.

3

우리는 Ant 파일에서 xml 파일을 구문 분석하여 Java 파일을 실행하거나 속성 값을 읽는 등의 작업을 수행해야합니다. 매우 쉽습니다. <xmlproperty>이라는 태그로이 작업을 수행 할 수 있습니다. 이 태그는 xml 파일을로드하고 내부적으로 ant 속성 값에있는 xml 파일의 모든 값을 변환하며이 값을 ant 속성으로 사용할 수 있습니다. 예를 들어

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

은 개미 스크립트 파일에이 거의 비슷하다 : <property name="root.properties.foo" value="bar"/> 당신은 $ {root.properties.foo}이 값을 인쇄 할 수 있습니다.

전체 예 : 1. 하나 개의 XML 파일을 만들기 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> 

확인 말 Info.xml 2. 하나의 개미 스크립트를 작성 말한다.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) 개미 스크립트를 실행하면 출력

위해 빌드 파일 얻을 것이다 : C : \ XML_ANT_Workspace \ XML_ANT \ SRC \ Check.xml 초기화 : [에코] 학생 이름 : Binod 쿠마의 Suman [에코] 롤 : (110) [에코] 도시 : 방갈로르 BUILD SUCCESSFUL 총 시간 : 125 밀리 초

그것은 여기 개까지 매우 간단했다,하지만 당신은 XML에서 여러 레코드가있는 경우 (StudentsInfo.xml) 번째 이 쉼표 모든 기록을 보여줍니다 도중이

위해 빌드 파일과 같이 구분 : C를 : \ XML_ANT_Workspace \ XML_ANT \ SRC \ Check.xml 초기화 : [에코] 학생 이름 : Binod 쿠마의 Suman, 프라 모드 모디, 마니 쿠마 [에코] 롤 : 110120130 [에코] 도시 : 방갈로르, 일본, 파트 BUILD SUCCESSFUL 총 시간 : 109 밀리 초

Link

관련 문제