태그 보관물: xml

xml

스크립팅 : XML 파일의 태그에서 값을 추출하는 가장 쉬운 방법은 무엇입니까? <version>1.0.74-SNAPSHOT</version>

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를 사용하여 그렇게 할 수 있기를 바랍니다. 그렇지 않으면 간단한 파이썬이 선호됩니다.

편집하다

  1. 강제

    리눅스 상자는 회사 환경에 있으므로 이미 설치된 도구 만 사용할 수 있습니다 (xml2와 같은 유틸리티를 요청할 수는 없지만 많은 빨간 테이프를 거쳐야합니다). 일부 솔루션은 매우 우수하지만 (몇 가지 새로운 트릭을 이미 배우십시오) 제한된 환경으로 인해 적용되지 않을 수 있습니다

  2. 업데이트 된 XML 목록

    원본 태그에 dependencies 태그를 추가했습니다. 이 경우 해키 솔루션이 작동하지 않을 수 있습니다.

  3. 배포

    내가 사용하는 배포판은 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']"