从linux shell计算xml元素的数量

Lon*_*don 11 python xml linux perl

我的xml看起来像这样:

<elements>
<elem>
....bunch of other elements
</elem>
</elements>
Run Code Online (Sandbox Code Playgroud)

有没有办法通过elemlinux shell计算某些xml文件中标记的出现次数?像perl/python或任何可能作为一个衬垫的东西?

我可能会尝试类似的东西grep -c "elem" myfile.xml和我得到的数字2并得到数字,是否有类似但一个班轮?

编辑:

我正在寻找替代的grep解决方案

Mar*_*air 15

xml_grep工具可以满足您的需求 - 尝试以下方法:

xml_grep --count //elem example.xml
Run Code Online (Sandbox Code Playgroud)

该实用xml-twig-tools程序位于Debian/Ubuntu 的包中,文档在这里.

  • 它还安装了`cpan XML :: Twig` (2认同)

blu*_*e10 7

您还可以使用xmllint:

xmllint --xpath "count(//elem)" myfile.xml
Run Code Online (Sandbox Code Playgroud)

  • 目前,这是迄今为止该主题的最佳答案。使用适当的xml工具是解决问题的方法,而不是一些棘手的grep解决方案。 (2认同)

gho*_*g74 0

@OP,所有grep解决方案都有一个基本的“缺陷”,如果<elem>一行中有超过 1 个标签,它将错过计数。用于awk以编程方式计数

awk 'BEGIN{
    totalelem=0
    totalendelem=0
}
/<elem>/{
    m = split($0,a,"<elem>") # or m = gsub(/<elem>/,"")
    totalelem+=m-1
}
/<\/elem>/{
    m = split($0,b,"</elem>") # or m = gsub("</elem>","")
    totalendelem+=m-1
}
END{
    print "Total elem tags: " totalelem
    print "Total end elem tags: " totalendelem
    # if you want to make sure each elem tag is enclosed  by corresponding end elem tag
    if ( totalelem == totalendelem ){
        print "Equal start and end tags"
    }
}
' file
Run Code Online (Sandbox Code Playgroud)

该解决方案假设您知道您的 elem 标签是什么样的。没有<elem />或者有额外属性的..