9

を使用して多数の xml ファイル (maven poms) を処理しようとしていますxmllint --xpath。いくつかの試行錯誤の結果、これらのファイルのデフォルトの名前空間宣言が正しくないために、期待どおりに機能しないことがわかりました。これは次のとおりです。

<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">

単純なコマンドは次のように失敗します。

$ echo $(xmllint --xpath '/project/modelVersion/text()' pom.xml )
XPath set is empty

xmlns 属性を削除した場合、ルート要素を次のように置き換えます。

<project 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">

前のコマンドは、予想される出力を提供します。

$ echo $(xmllint --xpath '/project/modelVersion/text()' pom.xml )
4.0.0

特にmaven自体は文句を言わないので、何百ものpomファイルを変更することはオプションではありません。

xmllintでファイルを処理する方法はありますかxmlns?

アップデート

ダミアンのおかげで、私はいくつかの進歩を遂げることができました:

$ ( echo setns x=http://maven.apache.org/POM/4.0.0; echo 'xpath /x:project/x:modelVersion/text()'; ) | xmllint --shell pom.xml
/ > setns x=http://maven.apache.org/POM/4.0.0
/ > xpath /x:project/x:modelVersion/text()
Object is a Node Set :
Set contains 1 nodes:
1  TEXT
    content=4.0.0

しかし、これは私が必要とすることを完全には行いません。私のフォローアップの質問は次のとおりです。

  1. テキストだけを印刷する方法はありますか?4.0.0上記の例で出力に on を含めたい

  2. 約 30 文字で出力が切り捨てられるようです。完全な出力を取得することは可能ですか? これは起こりませんxmllint --xpath

4

2 に答える 2

9

名前空間を sed で取り除く

で与えられたpom.xml

<?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>
</project>

これ:

cat pom.xml | sed '2 s/xmlns=".*"//g' | xmllint --xpath '/project/modelVersion' -

これを返します:

<modelVersion>4.0.0</modelVersion>

ファンキーな書式設定 (xmlns 属性が独自の行にあるなど) がある場合は、最初にフォーマッタを実行します。

cat pom.xml | xmllint --format - | sed '2 s/xmlns=".*"//g' | xmllint --xpath '/project/modelVersion' -
于 2015-05-01T00:19:19.493 に答える