pom.xml (Maven의 ‘Project Object Model’)을 읽고 버전 정보를 추출하고 싶습니다. 예를 들면 다음과 같습니다.
<?xml version="1.0" encoding="UTF-8"?><project
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany</groupId>
<artifactId>project-parent</artifactId>
<name>project-parent</name>
<version>1.0.74-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.sybase.jconnect</groupId>
<artifactId>jconnect</artifactId>
<version>6.05-26023</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
</project>
위에서 ‘1.0.74-SNAPSHOT’버전을 어떻게 추출 할 수 있습니까?
간단한 bash 스크립팅 sed 또는 awk를 사용하여 그렇게 할 수 있기를 바랍니다. 그렇지 않으면 간단한 파이썬이 선호됩니다.
편집하다
-
강제
리눅스 상자는 회사 환경에 있으므로 이미 설치된 도구 만 사용할 수 있습니다 (xml2와 같은 유틸리티를 요청할 수는 없지만 많은 빨간 테이프를 거쳐야합니다). 일부 솔루션은 매우 우수하지만 (몇 가지 새로운 트릭을 이미 배우십시오) 제한된 환경으로 인해 적용되지 않을 수 있습니다
-
업데이트 된 XML 목록
원본 태그에 dependencies 태그를 추가했습니다. 이 경우 해키 솔루션이 작동하지 않을 수 있습니다.
-
배포
내가 사용하는 배포판은 RHEL4입니다.
답변
xml2는 xml을 라인 지향 형식으로 변환 할 수 있습니다.
xml2 < pom.xml | grep /project/version= | sed 's/.*=//'
답변
다른 방법 : xmlgrep 및 XPath :
xmlgrep --text_only '/project/version' pom.xml
단점 : 느리게
답변
사용 python
$ python -c 'from xml.etree.ElementTree import ElementTree; print ElementTree(file="pom.xml").findtext("{http://maven.apache.org/POM/4.0.0}version")'
1.0.74-SNAPSHOT
사용 xmlstarlet
$ xml sel -N x="http://maven.apache.org/POM/4.0.0" -t -m 'x:project/x:version' -v . pom.xml
1.0.74-SNAPSHOT
사용 xmllint
$ echo -e 'setns x=http://maven.apache.org/POM/4.0.0\ncat /x:project/x:version/text()' | xmllint --shell pom.xml | grep -v /
1.0.74-SNAPSHOT
답변
클로저 방식. 특수 jar 파일이있는 jvm 만 필요합니다.
java -cp clojure.jar clojure.main -e "(use 'clojure.xml) (->> (java.io.File. \"pom.xml\") (clojure.xml/parse) (:content) (filter #(= (:tag %) :version)) (first) (:content) (first) (println))"
스칼라 방법 :
java -Xbootclasspath/a:scala-library.jar -cp scala-compiler.jar scala.tools.nsc.MainGenericRunner -e 'import scala.xml._; println((XML.load(new java.io.FileInputStream("pom.xml")) match { case <project>{children @ _*}</project> => for (i <- children if (i match { case <version>{children @ _*}</version> => true; case _ => false; })) yield i })(0) match { case <version>{Text(x)}</version> => x })'
그루비 방식 :
java -classpath groovy-all.jar groovy.ui.GroovyMain -e 'println (new XmlParser().parse(new File("pom.xml")).value().findAll({ it.name().getLocalPart()=="version" }).first().value().first())'
답변
Perl의 대안은 다음과 같습니다.
$ perl -MXML::Simple -e'print XMLin("pom.xml")->{version}."\n"'
1.0.74-SNAPSHOT
깊이가 다른 여러 “버전”요소가있는 질문에서 수정 / 확장 된 예제와 함께 작동합니다.
답변
해키 웨이 :
perl -e '$_ = join "", <>; m!<project[^>]*>.*\n(?: |\t)<version[^>]*>\s*([^<]+?)\s*</version>.*</project>!s and print "$1\n"' pom.xml
필요한 정확한 들여 쓰기에 의존 <version>
답변
매우 서투른 단일 라이너 솔루션을 개발하십시오.
python -c "from xml.dom.minidom import parse;dom = parse('pom.xml');print [n for n in dom.getElementsByTagName('version') if n.parentNode == dom.childNodes[0]][0].toxml()" | sed -e "s/.*>\(.*\)<.*/\1/g"
끝에있는 sed는 매우 못 생겼지 만 mindom만으로 노드의 텍스트를 인쇄 할 수 없었습니다.
_Vi에서 업데이트 :
덜 해킹 된 파이썬 버전 :
python -c "from xml.dom.minidom import parse;dom = parse('pom.xml');print [i.childNodes.item(0).nodeValue for i in dom.firstChild.childNodes if i.nodeName == 'version'].pop()"
나에게서 업데이트
다른 버전 :
python -c "from xml.dom.minidom import parse;dom = parse('pom.xml');print [n.firstChild.data for n in dom.childNodes[0].childNodes if n.firstChild and n.tagName == 'version']"