xml - 在 linux 中搜索 xml 文件

标签 xml linux

我有几个非常大(10GB)的 xml 文件,具有以下结构。如您所见,该文件包含一系列记录。我想做的是根据一个或多个属性搜索记录。问题是一个简单的 grep 会给我包含该属性的行。因此,例如,grep 可能会给我第 100 行、第 300 行等等。但是,我需要的是提取相关记录元素的能力,而不仅仅是匹配的行。是否有任何 Unix 实用程序可以提供帮助?

<records>
 <record seq="1">
  <properties>
   <property name="AssetId">1234</property>
  </properties>
 <message>messsage1</message>
</record>
<record seq="2">
 <properties>
  <property name="VI-ID">4567</property>
 </properties>
 <message>message2</message>
</record>
<records>

最佳答案

xmlstarlet允许您从 shell 脚本运行 XPath;这是一个完美的用例。

例如:

xmlstarlet sel -t \
  -m '//record[properties/property[@name="AssetId"][text()="1234"]]' \
  -c .

将打印 AssetId 属性为 1234 的整个记录​​。

如果你想在一次传递中进行多次匹配,这也是支持的:

xmlstarlet sel \
  -t -m '//record[properties/property[@name="AssetId"][text()="1234"]]' \
     -c . -n -n \
  -t -m '//record[properties/property/@name="VI-ID"]' \
     -c . -n -n \
  <input.xml

...此版本将打印 AssetID 为 1234 的记录,或带有任何值的 VI-ID 的任何记录,并在每条记录后放置两个换行符。

关于xml - 在 linux 中搜索 xml 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10439929/

相关文章:

java - 如何使用 JAXB 编写多个 XML 根元素

xml - 在 Blackberry 中创建 XML 的更好方法

mysql - 应用程序名称、表单名称未出现在 Orbeon Forms 中

objective-c - Apple LLVM 编译器 4.0 在打印 XML (NSLog) 时卡住 xcode 和应用程序

c - 开发 iptables 模块的最佳方法是什么

c - 使用 bfd 从跟踪中恢复位置信息

c - linux 打开标志中的按位或

php - 将多个社交媒体网站上的关注者数量提升到一种XML

c++ - 特定线程上的 gdb nostop SIGSEGV

linux - 在内核模块中使用 GPIO