28058


rest api をたたいた結果を、 xmllint
で処理することがあります。このとき、自分の知識では、以下のようにほしいタグを抽出することはできても、その中身だけを取り出すことができないと思っています。

もちろん、結果をさらに sed
で処理するなどすれば、タグの中身を抽出するのはできるのですが、ちょっとしたスクリプトを書くときなどに、いちいちこれを記述するのは手間です。xmllint
だけで、タグの中身だけを出力することはできませんでしょうか。

* * *

例えばのコマンド

[code]

    curl http://www.redmine.org/projects/redmine/issues.xml |
        xmllint --xpath /issues/issue/id -
    
[/code]

今現在の出力:

[code]

    <id>23505</id><id>23502</id><id>23501</id><id>23498</id><id>23497</id><id>23495</id><id>23493</id><id>23491</id><id>23488</id><id>23478</id><id>23472</id><id>23471</id><id>23470</id><id>23467</id><id>23463</id><id>23459</id><id>23458</id><id>23448</id><id>23444</id><id>23434</id><id>23430</id><id>23429</id><id>23425</id><id>23423</id><id>23419</id>
    
[/code]

ほしい出力:

[code]

    23505
    23502
    23501
    23498
    23497
    23495
    23493
    23491
    23488
    23478
    23472
    23471
    23470
    23467
    23463
    23459
    23458
    23448
    23444
    23434
    23430
    23429
    23425
    23423
    23419
    
[/code]


CC BY-SA 3.0
2016-08-04T04:31:15.510
28054
2016-08-04T08:51:16.460
754
question
shellscript unix
xmllint で、タグの中身だけを取得したい


回りくどい方法になりますが、以下の様にすると期待通りの出力結果にはなります(非効率ではありますが)。

[code]

    $ curl -sO http://www.redmine.org/projects/redmine/issues.xml
    $ cnt=$(xmllint --xpath 'count(/issues/issue/id)' issues.xml)
    $ for((i=1;i<=$cnt;i++)){
        xmllint --xpath "/issues/issue[$i]/id/text()" issues.xml
        echo
      }
    
[/code]

xmllint にこだわりがなければ python などを使う方が良いかと思います。

[code]

    import sys
    import xml.etree.ElementTree as ET
    
    for id in ET.parse(sys.stdin).getroot().findall('issue/id'):
      print id.text
    
[/code]


CC BY-SA 3.0
2016-08-04T08:51:16.460
28058
2016-08-04T08:51:16.460
28054
answer