在bash中格式化和组合xpath的输出 [英] Format and combine output of xpath in bash

查看:20
本文介绍了在bash中格式化和组合xpath的输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 bash 实用程序 xpath 解析此 xml 输入:

I'm trying to parse this xml input using the bash utility xpath:

<?xml version="1.0" encoding="UTF-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#">
    <entry>
        <title>Title 1</title>
        <author>Author 1</author>
    </entry>
    <entry>
        <title>Title 2</title>
        <author>Author 2</author>
    </entry>
</feed>

我需要这种格式的输出:

I need an output in this format:

1. Title: Title 1
   Author: Author 1
2. Title: Title 2
   Author: Author 2

为了以简单的方式(仅使用一个 xpath 命令或最多 3-4 个命令)实现这一目标,我做了很多尝试,但我所有的努力都白费了.有人可以帮我解决这个问题吗?

I've fiddled around a lot trying to achieve this in a simple way (using only a single xpath command, or at most 3-4 commands), but all my efforts have been in vain. Could anyone please help me out with this?

推荐答案

Bash 版本

#!/bin/bash
count=1
input=input.xml

while [ -n "$title" -o $count = 1 ]
do
    title=`cat $input | xpath //entry[$count]/title 2>/dev/null | sed s/<title>//g| sed s/<\\/title>//g`
    author=`cat $input | xpath //entry[$count]/author 2>/dev/null | sed s/<author>//g| sed s/<\\/author>//g`
    if [ "$title" -a "$author" ]; then
        echo $count $title $author
    fi
    count=$((count+1))
done

Perl 版本(未经测试)...

Perl version (untested) ...

#!/usr/bin/perl
use XML::XPath;

my $file = 'input.xml';
my $xp = XML::XPath->new(filename => $file);
my $count = 1;
foreach my $entry ($xp->find('//entry')->get_nodelist){
    print $count;
    print 'Title:' . $entry->find('title')->string_value;
    print 'Author: ' . $entry->find('author');
    $count++;
}

这篇关于在bash中格式化和组合xpath的输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆