개미의 build.xml을 구문 분석하고 해석하는 방법
문제
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를 사용하세요.