【问题标题】:shell to find the xml tags for a given attributeshell 查找给定属性的 xml 标签
【发布时间】:2021-05-08 04:40:12
【问题描述】:

需要帮助来找到一个简单的 shell 函数来获取以下输入: 1.XML文件 2.一种模式

输出将是 XML 文件中从打开标记到结束标记的部分,其中包含此模式(标记名称已知)

示例 XML 文件部分

<dependency>
<artifact>AAA</artifact>
<package>BBB</package>
<version>${versionParam}</version>
</dependency>

要检查的模式是“BBB”

输出应该是上述 XML 文件中的整个部分(即从依赖项打开标记到依赖项结束标记)

注意 - 已知/假设模式需要位于“依赖”标签内

到目前为止,我有一个函数,它将遍历所有 XML 找到所有依赖项标签,然后在每个依赖项中搜索此模式

该功能有效,但效率不够 我正在寻找不会扫描其中的所有 XML 和所有依赖项标签但会更快找到它的东西:-) 我的代码有大量的 XML 和大量的依赖标签——这就是我正在寻找更快的东西的原因

提前致谢

【问题讨论】:

  • 查询 XML 的最佳语言是 XQuery。我不确定它是否适用于您的环境。
  • 如果您正在寻找所有具有package 值的dependency 元素(例如BBB),您还不清楚您希望代码如何避免读取整个XML 文档。如果您只对第一场比赛感兴趣,那么 XSLT 3 与流媒体和例如xsl:iteratexsl:break 可以在找到第一个匹配项后停止 Saxon EE 中的处理。另一种选择是使用 XML 数据库,一旦您插入并索引文件,搜索应该比读取代码更快。

标签: xml shell


【解决方案1】:

如评论中所述,XQuery 是在 shell 脚本中从 XML 文件中查找和提取数据的方法。

使用xmllint,这是一个用于处理 XML 的常用命令行实用程序:

 xmllint --xpath '//dependency[contains(., "BBB")]' input.xml

或者xmlstarlet,另一个有用的 XML 工具:

xmlstarlet sel -t -c '//dependency[contains(., "BBB")]' input.xml

【讨论】:

  • 非常感谢!不熟悉这些实用程序 - 非常好!
  • xidel: xidel -s input.xml -e '//dependency[contains(., "BBB")]' --printed-node-format=xml, xidel -s input.xml -e '//dependency[contains(., "BBB")]/outer-xml()'
猜你喜欢
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
相关资源
最近更新 更多