3
]$ xmllint --version
xmllint: using libxml version 20626

我的 xml 文件看起来像这样:

<projects>
 <architecture name="ARCH1">
  <project label="StringA1" type="StringB1" state="StringC1"/>
   ......
 </architecture>
 <architecture name="ARCH2">
  <project label="StringA2" type="StringB2" state="StringC2"/>
  ......
 </architecture>
</projects>

例如,我想获得StringB2给定条件name==ARCH2和的值state==StringC2。是否可以使用xmllint命令行选项,如果可以,如何?一些例子将是有益的。

sed我可以使用or提取这些,awk但这可能不是一个好的解决方案。

4

2 回答 2

4

尝试以下

xmllint --xpath 'string(///project[../@name="ARCH1" and @state="StringC1"]/@type)' data.xml

版本:

$ xmllint --version
xmllint: using libxml version 20900
   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-08-22T21:21:53.770 回答
4

利用:

xmllint --xpath '//architecture[@name="ARCH2"]/project/@type'

或者如果你只想要字符串并且只想要字符串:

xmllint --xpath 'string(//architecture[@name="ARCH2"]/project/@type)'

在测试此语句时,我意识到 xmllint (20708) 的 ubuntu (12.04) 版本在执行此命令时会因段错误而终止。我从https://git.gnome.org/browse/libxml2/refs/克隆了最新版本并编译。现在上面的命令有效。

于 2013-08-22T20:39:53.007 回答