我需要为一个值解析一组特定的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>
答案 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
的答案中建议的各种其他选项(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“。