1

我有一个包含数万个相同元素的大型 XML 文件:

<rootElem>
    <fizz buzz="true">234</fizz>
    <fizz buzz="false">384</fizz>
    <fizz buzz="true"></fizz>
    <fizz buzz="true">39494</fizz>
    <fizz/>
</rootElem>

我想运行一个grep打印出任何<fizz>不包含文本/正文数据的元素(开始和结束标签之间的数字)。在上面的示例中,grep将为<fizz>不包含数字数据的第 3 和第 5 个元素生成 2 行。文件名为fizzes_20.xml. 我尝试运行以下但无济于事:

  • grep fizzes_20.xml "></>"
  • grep fizzes_20.xml "/>"

有任何想法吗?提前致谢!

4

3 回答 3

3

xmllint 命令可用于实现空节点的 xpath 表达式测试:

$ xmllint --xpath "//fizz[not(text())]" data.xml 
<fizz buzz="true"/><fizz/>

更新

$ xmllint --version
xmllint: using libxml version 20901
   compiled with: Threads Tree Output Push Reader Patterns Writer SAXv1 FTP HTTP DTDValid HTML Legacy C14N Catalog XPath XPointer XInclude Iconv ISO8859X Unicode Regexps Automata Expr Schemas Schematron Modules Debug Zlib Lzma 
于 2013-03-21T02:14:48.740 回答
1

使用这种模式很容易实现:

grep -E '<fizz/>|<fizz.*><' fizzes_20.xml
于 2013-03-21T01:39:09.553 回答
0

试试这个命令:

egrep '<fizz.*(/>|></fizz>)' fizzes_20.xml

<fizz匹配标签开头和标题,匹配.*任何属性,括号中的最后一部分匹配自闭合标签或没有内容的标签。希望这可以帮助!

于 2013-03-21T01:41:42.497 回答