使用 xmlstarlet 或 xmllint 获取属性值

Posted

技术标签:

【中文标题】使用 xmlstarlet 或 xmllint 获取属性值【英文标题】:get attribute value using xmlstarlet or xmllint 【发布时间】:2018-07-13 16:44:04 【问题描述】:

自过去两天以来,我已经解决了几个问题,但尚未找到解决方案。这是我的xml:

<?xml version="1.0" encoding="UTF-8"?>

<Environment xmlns="http://schemas.dmtf.org/ovf/environment/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oe="http://schemas.dmtf.org/ovf/environment/1" xmlns:ve="http://www.vmware.com/schema/ovfenv" oe:id="" ve:vCenterId="">
  <PropertySection>
<Property oe:key="vami.hostname" oe:value="jal"/>
<Property oe:key="vamitimezone" oe:value="Asia/Kolkata"/>
<Property oe:key="ABC_enable" oe:value="1"/>
<Property oe:key="software_only_installer_name" oe:value="install-r8-0-0-0"/>
<Property oe:key="software_only_staging_dir" oe:value="/media/dir"/>
<Property oe:key="software_only_mount_dir" oe:value="/media/cdrom"/>
  </PropertySection>
</Environment>

我想在 oe:key="ABC_enable" 时获取属性值(oe:value)。

我已经用 xmllint 和 xmlstarlet 尝试了很多次,但无法得到我想要的。 你能帮忙吗?

【问题讨论】:

xmlstarlet select value 的副本 【参考方案1】:

xmlstarlet工具的正确方法:

xmlstarlet sel -N oe="http://schemas.dmtf.org/ovf/environment/1" \
-N ve="http://www.vmware.com/schema/ovfenv" --net -t -v \
'//oe:Property[@oe:key="ABC_enable"]/@oe:value' -n input.xml

输出:

1

【讨论】:

天啊!这确实有效。即使我使用 awk 使它工作,这也应该被接受为正确答案,因为我正在寻找使用 xml-parser 的解决方案。谢谢! @Promod,欢迎。解析 xml/html 数据时始终使用 xml/html 解析器【参考方案2】:

所以我能够通过 awk 完成这项工作。

awk '/ABC_enable/print $4' FS='"' xmlfile.xml

这对我有用,因为“ABC_enable”在此文件中只会出现一次,并且格式将始终保持不变。我知道这个解决方案不能通用,但它可以完成我的工作。

【讨论】:

以上是关于使用 xmlstarlet 或 xmllint 获取属性值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 xmlstarlet 为 xml 文件的每个节点添加不同的属性

使用 XSD 时 xmllint 验证错误“未找到 DTD”

如何使用 xmlstarlet 在另一个元素下插入新元素?

xmllint:如何使用本地 DTD 文件验证 XML

如何在 Sublime Text 3 中使用 xmllint?

python:使用xmllint时,子进程通信等待无限期