使用xmllint命令行的模式

时间:2013-08-22 20:31:27

标签: xml bash xmllint

]$ 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>

例如,我希望在StringB2name==ARCH2条件下获得值state==StringC2。是否可以使用xmllint命令行选项,如果是,怎么做?一些例子将是有益的。

我可以使用sedawk提取这些内容,但这可能不是一个好的解决方案。

2 个答案:

答案 0 :(得分: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/克隆了最新版本并进行了编译。现在上面的命令有效。

答案 1 :(得分:3)

尝试以下

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