Ant*_*ong 14 linux unix xml bash python
我想读取 pom.xml(Maven 的“项目对象模型”)并提取版本信息。下面是一个例子:
<?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>
Run Code Online (Sandbox Code Playgroud)
如何从上面提取版本“1.0.74-SNAPSHOT”?
希望能够使用简单的 bash 脚本 sed 或 awk 来做到这一点。否则首选简单的python。
编辑
约束
linux box 在公司环境中,所以我只能使用已经安装的工具(不是说我不能请求诸如 xml2 之类的实用程序,但我必须经历很多繁文缛节)。一些解决方案非常好(已经学习了一些新技巧),但由于环境限制,它们可能不适用
更新的 xml 列表
我在原始列表中添加了依赖项标签。这将显示一些 hacky 解决方案在这种情况下可能不起作用
发行版
我使用的发行版是 RHEL4
Vi.*_*Vi. 18
xml2 可以将 xml 转换为/从面向行的格式:
xml2 < pom.xml | grep /project/version= | sed 's/.*=//'
Run Code Online (Sandbox Code Playgroud)
其他方式:xmlgrep 和 XPath:
xmlgrep --text_only '/project/version' pom.xml
Run Code Online (Sandbox Code Playgroud)
缺点:慢
使用 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
Run Code Online (Sandbox Code Playgroud)
使用 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
Run Code Online (Sandbox Code Playgroud)
使用 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
Run Code Online (Sandbox Code Playgroud)
Clojure 方式。只需要带有特殊 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))"
Run Code Online (Sandbox Code Playgroud)
斯卡拉方式:
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 })'
Run Code Online (Sandbox Code Playgroud)
常规方式:
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())'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
65234 次 |
| 最近记录: |