1

奇妙な階層のbashスクリプトを使用して数百のpomを解析し、すべてのプロジェクトの概要を1つのレポートに抽出しています(maven-info-projects:project-teamでは一度に実行できないようなものです)。公開されていない理由で、親pomをいじったり、maven-info-projectsセクションを構成したりしたくありません。

XMLStarletがインストールされているのに使用していますが、 xmllintはインストールされていません。

以下を含むpom.xml抽出が与えられます:

<developer>
   <id>devId</id>
   <name>Developer Name</name>
   <email>dev@nowhere.com</email>
   <roles>
      <role>Project manager</role>
      <role>Developer</role>
   </roles>
</developer>

XMLStarletを1回呼び出すだけで、複数のロールを含むすべての開発者情報を抽出するにはどうすればよいですか?

現時点では、次の方法で情報の大部分を抽出できます。

# Developers
locate_section_values $pom_file_name "/x:project/x:developers/x:developer" \
    "concat( \
        x:id, '|', x:name, '|', x:email, '|', x:roles, '|', \
        x:organization, '|', x:organizationUrl, '|', x:timezone
     )"

どこ

function locate_section_values(){
  local xml_file=$1
  local section=$2
  local value_table=$3

  OLD_IFS=$IFS
  IFS=$'\n'
  xml_values=()
  xml_values=(`xmlstarlet sel -B -N x="http://maven.apache.org/POM/4.0.0" -t -m "$section" -v "$value_table" -nl $xml_file`)
  IFS=$OLD_IFS
}

次に、結果を分割します。

  for developer in ${xml_values[@]}; do
    IFS='|' 
    set $developer # split into $1, $2, etc using | as seperator
    #echo "id:${1}, name:${2}, roles:${4}"

    if [ -n "${1}" ]; then # id
      developer_id=${1}
      developer_ids+=( $developer_id )
    fi
    ...

問題は、複数の役割を持つ開発者が役割を連結することです。

 Project managerDeveloper

xmlstarletの元の呼び出しに、複数の役割を組み合わせて、たとえばコンマ区切りのリストにする方法はありますか?

4

2 に答える 2

2

以下はおおよそあなたが望むものを与えると思いますが、インターフェースを次のように変更する必要がありますlocate_section_values

xmlstarlet sel -T -B -N x="http://maven.apache.org/POM/4.0.0" \
   -t -m "/x:project/x:developers/x:developer" -v "x:id" -o "|" \
   -v "x:name" -o "|" -v "x:email" -o "|" \
   -m "x:roles/x:role" -v "." -o "," -b -o "|" \
   -v "x:organization" -o "|" -v "x:organizationUrl" -o "|" \
   -v "x:timezone" --nl 
  $pom_file_name

コーディングが簡単なため、ロールはコンマで終了するリストとして生成されます。


locate_section_valuessans eval

function locate_section_values() {
    local xml_file=$1 # $local_project_dir/$fixed_name/pom.xml
    local section=$2 #/x:project/x:modules/x:module
    local value_table=("${@:3}")

    OLD_IFS=$IFS
    IFS=$'\n'
    xml_values=($(xmlstarlet sel -B -N x=http://maven.apache.org/POM/4.0.0 \
        -t -m "$section" "${value_table[@]}" --nl "$xml_file"))
    IFS=$OLD_IFS
}

電話:

locate_section_values "$pom_file_name" '/x:project/x:developers/x:developer' \
      -v 'x:id' -o '|' -v 'x:name' -o '|' -v 'x:email' -o '|' \
      -m 'x:roles/x:role' -v '.' -o ', ' -b -o '|' \
      -v 'x:organization' -o '|' -v 'x:organizationUrl' -o '|' \
      -v 'x:timezone'

開発者をループし、フィールドを抽出します。

for developer in "${xml_values[@]}"; do
    # get | separated fields
    IFS='|' read id name email roles org orgUrl timezone <<<"$developer"

    if [ -n "$roles" ]; then # roles
        developer_roles_csv=${roles%, } # strip trailing comma
    fi

    echo "$name ($id) has roles: $developer_roles_csv."

done # developer
于 2013-01-29T00:09:09.390 に答える
0

@npostavsによって提供された回答に基づいて、私は次のように機能します。

function locate_section_values(){
  local xml_file=$1 # $local_project_dir/$fixed_name/pom.xml
  local section=$2 #/x:project/x:modules/x:module
  local value_table=${@:3}

  OLD_IFS=$IFS
  IFS=$'\n'
  xml_values=()
  xml_cmd="xmlstarlet sel -B -N x=\"http://maven.apache.org/POM/4.0.0\" \
      -t -m \"$section\" $value_table -nl $xml_file"
  xml_values=(`eval $xml_cmd`)
  IFS=$OLD_IFS
}

私がこのように呼ぶと、これは開発者を解析します:

  # Developers
  locate_section_values $pom_file_name "/x:project/x:developers/x:developer" \
      -v \"x:id\" -o \"\|\" -v \"x:name\" -o \"\|\" -v \"x:email\" -o \"\|\" \
      -m \"x:roles/x:role\" -v \".\" -o \", \" -b -o \"\|\" \
      -v \"x:organization\" -o \"\|\" -v \"x:organizationUrl\" -o \"\|\" \
      -v \"x:timezone\"

「developer_roles_csv=$ {4%??}」を使用すると、末尾の「カンマとスペース」を簡単に削除できます。

  OLD_IFS=$IFS
  IFS=$'\n'
  for developer in ${xml_values[@]}; do
    IFS='|' 
    set $developer # split into $1, $2, etc using | as seperator

    ....

    if [ -n "${4}" ]; then # roles
      developer_roles_csv=${4%??} # strip trailing comma
      .....
    fi

    ....

  done # developer
  IFS=$OLD_IFS
于 2013-01-29T09:17:36.540 に答える