【问题标题】:fetch data from an XML file between two different contents从两个不同内容之间的 XML 文件中获取数据
【发布时间】:2013-11-26 03:39:12
【问题描述】:

我正在尝试获取两个 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'

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

有人可以帮忙吗?

【问题讨论】:

    标签: xml linux bash shell sed


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      又快又脏:

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

      【讨论】:

        【解决方案3】:

        我建议使用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>
        

        【讨论】:

        • 我还有一个问题,我在同一个 XML 中有多个页面标签。所以我想得到一个页面,其中有一个名为 query="test environment" 的查询。 ?会不会有空间问题?
        • @San:编辑添加属性条件[@query = "test environment"]
        • 另外,我必须给出包含“XML FILE”命令对吗?希望这行得通。
        猜你喜欢
        • 2017-04-08
        • 1970-01-01
        • 2019-09-21
        • 2020-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-22
        • 1970-01-01
        • 2018-07-18
        相关资源
        最近更新 更多