XML解析使用Xpath(?)获取特定值

时间:2015-09-02 01:00:26

标签: bash xpath xml-parsing

我需要为一个值解析一组特定的XML文件。

在这种情况下,我需要找到<group>THISGROUP</group>的每个访问ID <permission>WRITE</permission>

在下面的示例中,我需要返回VX-3422867。此外,我需要能够在bash脚本中完成此任务。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AccessControlListDocument>
    <access id="VX-3422867">
        <loc>http://localhost:8080/API/item/VX-410070/access/VX-3422867</loc>
        <grantor>admin</grantor>
        <recursive>true</recursive>
        <permission>WRITE</permission>
        <group>THISGROUP</group>
    </access>
        <access id="VX-3422866">
        <loc>http://localhost:8080/API/item/VX-410070/access/VX-3422866</loc>
        <grantor>admin</grantor>
        <recursive>true</recursive>
        <permission>NONE</permission>
        <operation>
            <shape>
                <tag>original</tag>
            </shape>
        </operation>
        <group>THISGROUP</group>
    </access>
    <access id="VX-3422865">
        <loc>http://localhost:8080/API/item/VX-410070/access/VX-3422865</loc>
        <grantor>admin</grantor>
        <recursive>true</recursive>
        <permission>WRITE</permission>
        <group>TWO</group>
    </access>
    <access id="VX-3422869">
        <loc>http://localhost:8080/API/item/VX-410070/access/VX-3422869</loc>
        <grantor>admin</grantor>
        <recursive>true</recursive>
        <permission>ALL</permission>
        <group>THREE</group>
    </access>
    <access id="VX-3422868">
        <loc>http://localhost:8080/API/item/VX-410070/access/VX-3422868</loc>
        <grantor>admin</grantor>
        <recursive>true</recursive>
        <permission>ALL</permission>
        <group>FOUR</group>
    </access>
    <access id="VX-975588">
        <loc>http://localhost:8080/API/item/VX-410070/access/VX-975588</loc>
        <recursive>true</recursive>
        <permission>OWNER</permission>
        <user>user-one</user>
    </access>
</AccessControlListDocument>

3 个答案:

答案 0 :(得分:2)

使用THISGROUP组和权限WRITE打印所有访问条目的ID:

xmlstarlet sel \
  -t -m '//access[group="THISGROUP"][permission="WRITE"]' \
  -v @id -n <in.xml

答案 1 :(得分:2)

您可以使用以下XPath选择@id元素值等于'THISGROUP'且group元素值等于'WRITE'的访问元素的permission属性:

/AccessControlListDocument/access[group = 'THISGROUP' and permission='WRITE']/@id 

至于在bash脚本中执行,您可以查看使用xmlstarlet

xmlstarlet sel -t -v "/AccessControlListDocument/access[group = 'THISGROUP' and permission='WRITE']/@id" myFile.xml

或者使用How to execute XPath one-liners from shell?

的答案中建议的各种其他选项(xmllint,saxon-lint,saxon,python,xidel)

答案 2 :(得分:0)

whith xpath:

如果您只想首先获得属性:

   <xsl:value-of select="/AccessControlListDocument/access[child::group='THISGROUP' and child::permission='WRITE']/@id"/>

如果你想要每一个id属于那个条件:

<xsl:for-each select="/AccessControlListDocument/access[child::group='THISGROUP' and child::permission='WRITE']">
<xsl:value-of select="./@id"/>
</xsl:for-each>

这意味着从“ AccessControlListDocument ”父级“访问”节点中获取“ id ”属性,其中“访问权限“节点具有子节点”“,其值为”THISGROUP“,节点”权限“的值为”WRITE“。