从两个不同内容之间的XML文件中获取数据

时间:2013-11-13 13:44:43

标签: xml linux bash shell sed

我正在尝试在两个XML标记之间获取数据,如

<page size="10" seconds="184" name="TEST_ONE" query="test environment">
  <content1>...</content1>
  <content2>...</content2>
</page>

我试过了

cat ABC.XML | grep -oP '(?<=<page size="10" seconds="184" name="TEST_ONE" query="test environment">).*?(?=</page>)'

但我一无所获。我尝试使用sed和

一样
sed -e 's/<page size="10"\(.*\)page/\1/g'

但没有得到我想要的东西。我希望打印内容如下: ... ...

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

xmlstarlet救援!

xmlstarlet sel -t -v 'page' ABC.XML

有各种其他格式和查询的选项。

如果您想要子元素,请使用

xmlstarlet sel -t -c 'page/*' ABC.XML

并在评论中给出了“查询”答案:

xmlstarlet sel -t -c "page[@query='test environment']/*" ABC.XML

答案 1 :(得分:1)

又快又脏:

sed -e'1,/<page.*query="test environment">/ d' -e'/<\/page>/,$ d' abc1.xml 

答案 2 :(得分:0)

我建议使用xml解析器。这里有一个及其XML::Twig模块的示例:

#!/usr/bin/env perl

use warnings;
use strict;
use XML::Twig;

XML::Twig->new(
    twig_roots => {
        'page[@query = "test environment"]/*' => sub { $_->print },
    },  
    pretty_print => 'indented',
)->parsefile( shift );

像以下一样运行:

perl script.pl xmlfile

产量:

<content1>...</content1>
<content2>...</content2>