通过将 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