문제

ant build.xml을 읽고 여기에서 요소를 검색하기 위한 Ant API가 있습니까?특히 저는 경로 요소의 값을 검색하고 경로의 모든 요소를 ​​탐색할 수 있기를 원합니다.

내 목적은 주어진 경로를 검색하고 그것이 매니페스트에서 올바르게 참조되는지 확인하여 제품이 프로덕션으로 나갈 때 빌드와 매니페스트가 일치하는지 확인하는 것입니다.

편집하다:XML API를 사용하는 것에 대한 응답(그리고 그에 대한 감사)과 관련하여 문제는 현재 구성된 빌드 파일이 그보다 더 복잡하다는 것입니다.즉, 클래스 경로는 다른 클래스 경로를 참조하고 이를 포함하며 클래스 경로에서 참조된 요소 자체는 속성 파일에 정의되어 있으므로 적절하게 다시 생성하기에는 Ant API가 너무 많습니다.

도움이 되었습니까?

해결책

당신은 사용할 수 있습니다 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에서는 더 이상 사용되지 않습니다.

다른 팁

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

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

다음과 같이 개미 스크립트 파일의 내용과 대략 동일합니다.<property name="root.properties.foo" value="bar"/>${root.properties.foo}를 사용하여 이 값을 인쇄할 수 있습니다.

완전한 예:1.하나의 XML 파일을 만듭니다. say info.xml 2.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>

Check.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 init :[에코] 학생 이름 ::비노드 쿠마르 수만 [에코] 굴리다::110 [에코] 도시::벵갈루루 빌드 성공 총 시간:125밀리초

여기까지는 매우 간단했지만 xml(StudentsInfo.xml)에 여러 레코드가 있는 경우 다음과 같이 쉼표로 구분된 모든 레코드가 표시됩니다.

빌드 파일:C:\XML_ANT_Workspace\XML_ANT\src\Check.xml 초기화:[에코] 학생 이름 ::비노드 쿠마르 수만,프라모드 모디,마니시 쿠마르 [에코] 굴리다::110,120,130 [에코] 도시::방갈로르, 일본, 파트나 빌드 성공 총 시간:109밀리초

링크

사용 가능한 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 구문 분석 요구 사항을 충족하도록 사용자 정의하는 것이 매우 쉬워야 합니다.

특수 요소만 검색하려면 Java XML API를 사용하세요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top