通过将 xmlstarlet 或 xmllint 与 libxml 版本 20706 一起使用来获取值
Getting values by using xmlstarlet or xmllint with libxml version 20706
这是我的部分 xml;
<LOGICAL_DRIVE>
<LABEL VALUE = "01"/>
<STATUS VALUE = "Degraded"/>
<CAPACITY VALUE = "99 GiB"/>
<FAULT_TOLERANCE VALUE = "RAID 1/RAID 1+0"/>
<LOGICAL_DRIVE_TYPE VALUE = "Data LUN"/>
<ENCRYPTION_STATUS VALUE = "Not Encrypted"/>
<PHYSICAL_DRIVE>
<LABEL VALUE = "Port 1I Box 1 Bay 1"/>
<STATUS VALUE = "OK"/>
<MODEL VALUE = "MM1000GBKAL"/>
<CAPACITY VALUE = "931 GiB"/>
<MARKETING_CAPACITY VALUE = "1000 GB"/>
<LOCATION VALUE = "Port 1I Box 1 Bay 1"/>
<FW_VERSION VALUE = "HPGE"/>
<DRIVE_CONFIGURATION VALUE = "Configured"/>
<ENCRYPTION_STATUS VALUE = "Not Encrypted"/>
<MEDIA_TYPE VALUE = "HDD"/>
</PHYSICAL_DRIVE>
<PHYSICAL_DRIVE>
<LABEL VALUE = "Port 2I Box 1 Bay 5"/>
<STATUS VALUE = "FAILED"/>
<MODEL VALUE = "MM1000GBKAL"/>
<CAPACITY VALUE = "931 GiB"/>
<MARKETING_CAPACITY VALUE = "1000 GB"/>
<LOCATION VALUE = "Port 2I Box 1 Bay 5"/>
<FW_VERSION VALUE = "HPGE"/>
<DRIVE_CONFIGURATION VALUE = "Configured"/>
<ENCRYPTION_STATUS VALUE = "Not Encrypted"/>
<MEDIA_TYPE VALUE = "HDD"/>
</PHYSICAL_DRIVE>
</LOGICAL_DRIVE>
<LOGICAL_DRIVE>
我想获取 LABEL 的 VALUE,其中 LOGICAL_DRIVE 的 STATUS 的 VALUE 不正常。
我正在使用以下内容;
xmllint --xpath "//LOGICAL_DRIVE[.//STATUS[not(@VALUE='OK')]]/LABEL[@VALUE]" health.xml
但是,我有一个旧版本的系统,我无法更新它。这个我试过了;
xmlstarlet sel -t -m "//PHYSICAL_DRIVE/STATUS/@value='OK']" -v "../LABEL/text()" -nl health.xml
但是没有用。在这个版本的 xml 中,如何在 LOGICAL_DRIVE 的 STATUS 的 VALUE 不正常的情况下获取 LABEL 的 VALUE?
提前致谢
这是一个应该有效的 xmlstarlet 命令:
xmlstarlet sel -T -t -m "//PHYSICAL_DRIVE[not(STATUS/@VALUE='OK')]/LABEL" -v "@VALUE" -nl health.xml
这是我的部分 xml;
<LOGICAL_DRIVE>
<LABEL VALUE = "01"/>
<STATUS VALUE = "Degraded"/>
<CAPACITY VALUE = "99 GiB"/>
<FAULT_TOLERANCE VALUE = "RAID 1/RAID 1+0"/>
<LOGICAL_DRIVE_TYPE VALUE = "Data LUN"/>
<ENCRYPTION_STATUS VALUE = "Not Encrypted"/>
<PHYSICAL_DRIVE>
<LABEL VALUE = "Port 1I Box 1 Bay 1"/>
<STATUS VALUE = "OK"/>
<MODEL VALUE = "MM1000GBKAL"/>
<CAPACITY VALUE = "931 GiB"/>
<MARKETING_CAPACITY VALUE = "1000 GB"/>
<LOCATION VALUE = "Port 1I Box 1 Bay 1"/>
<FW_VERSION VALUE = "HPGE"/>
<DRIVE_CONFIGURATION VALUE = "Configured"/>
<ENCRYPTION_STATUS VALUE = "Not Encrypted"/>
<MEDIA_TYPE VALUE = "HDD"/>
</PHYSICAL_DRIVE>
<PHYSICAL_DRIVE>
<LABEL VALUE = "Port 2I Box 1 Bay 5"/>
<STATUS VALUE = "FAILED"/>
<MODEL VALUE = "MM1000GBKAL"/>
<CAPACITY VALUE = "931 GiB"/>
<MARKETING_CAPACITY VALUE = "1000 GB"/>
<LOCATION VALUE = "Port 2I Box 1 Bay 5"/>
<FW_VERSION VALUE = "HPGE"/>
<DRIVE_CONFIGURATION VALUE = "Configured"/>
<ENCRYPTION_STATUS VALUE = "Not Encrypted"/>
<MEDIA_TYPE VALUE = "HDD"/>
</PHYSICAL_DRIVE>
</LOGICAL_DRIVE>
<LOGICAL_DRIVE>
我想获取 LABEL 的 VALUE,其中 LOGICAL_DRIVE 的 STATUS 的 VALUE 不正常。
我正在使用以下内容;
xmllint --xpath "//LOGICAL_DRIVE[.//STATUS[not(@VALUE='OK')]]/LABEL[@VALUE]" health.xml
但是,我有一个旧版本的系统,我无法更新它。这个我试过了;
xmlstarlet sel -t -m "//PHYSICAL_DRIVE/STATUS/@value='OK']" -v "../LABEL/text()" -nl health.xml
但是没有用。在这个版本的 xml 中,如何在 LOGICAL_DRIVE 的 STATUS 的 VALUE 不正常的情况下获取 LABEL 的 VALUE?
提前致谢
这是一个应该有效的 xmlstarlet 命令:
xmlstarlet sel -T -t -m "//PHYSICAL_DRIVE[not(STATUS/@VALUE='OK')]/LABEL" -v "@VALUE" -nl health.xml