csv - xmlstarlet 使用子节点提取组信息
问题描述
我需要从一个复杂的 XML 文件中提取组信息,然后遍历组以执行一些更改,但是我无法以一种干净的方式循环获取数据。尝试了很多,看到了很多例子,但没有运气。任何帮助表示赞赏。
给定以下 XML 文件:
<?xml version='1.0' encoding='UTF-8'?>
<tsResponse xmlns="http://tableau.com/api" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tableau.com/api http://tableau.com/api/ts-api-3.12.xsd">
<pagination pageNumber="1" pageSize="100" totalAvailable="12"/>
<groups>
<group id="74c29008-7550-11eb-94d7-73020b27aff3" name="Todos os usuários">
<domain name="local"/>
</group>
<group id="e392c24a-535d-4e78-8463-0a492d61c317" name="Tbv_Vs_Operacoes">
<domain name="university.net"/>
<import domainName="university.net" siteRole="Viewer" grantLicenseMode="onLogin"/>
</group>
<group id="6c236376-aa1b-451e-8b63-488387aac20b" name="Tbv_Alertas_Inteligentes">
<domain name="university.net"/>
<import domainName="university.net" siteRole="Viewer" grantLicenseMode="onLogin"/>
</group>
<group id="58c86b3e-e1b2-46e5-9acf-43335de1c58d" name="TBE_VS_OPERACOES">
<domain name="university.net"/>
<import domainName="university.net" siteRole="ExplorerCanPublish" grantLicenseMode="onLogin"/>
</group>
<group id="89c33fb6-dce9-4097-9be8-f01d502cc11b" name="Tbl_Server_Admin_Creator">
<domain name="university.net"/>
<import domainName="university.net" siteRole="SiteAdministratorExplorer" grantLicenseMode="onLogin"/>
</group>
<group id="306dac3b-a377-451f-9283-c7be3533e02f" name="Tbv_Vs_Canais_Nao_Proprietarios">
<domain name="university.net"/>
<import domainName="university.net" siteRole="Viewer" grantLicenseMode="onSync"/>
</group>
<group id="9259961c-3ca7-4c1a-9c44-374a4555c270" name="Tbe_Vs_Canais_Nao_Proprietarios">
<domain name="university.net"/>
<import domainName="university.net" siteRole="Explorer" grantLicenseMode="onSync"/>
</group>
</groups>
</tsResponse>
如何获得像下面的 csv 一样的输出,每组一行和 4 列:id、name、siteRole 和 grantlicenseMode?
74c29008-7550-11eb-94d7-73020b27aff3,Todos os usuários,,
e392c24a-535d-4e78-8463-0a492d61c317,Tbv_Vs_Operacoes,Viewer,onLogin
6c236376-aa1b-451e-8b63-488387aac20b,Tbv_Alertas_Inteligentes,Viewer,onLogin
58c86b3e-e1b2-46e5-9acf-43335de1c58d,TBE_VS_OPERACOES,ExplorerCanPublish,onLogin
...
我设法使用以下命令输出“组”节点内的值:
xmlstarlet sel -N api=http://tableau.com/api -T -t -m //api:group -v "concat(@id,';',@name,';',import/@siteRole,';',import/@grantLicenseMode)" -n groups.xml
74c29008-7550-11eb-94d7-73020b27aff3;Todos os usuários;;
e392c24a-535d-4e78-8463-0a492d61c317;Tbv_Vs_Operacoes;;
6c236376-aa1b-451e-8b63-488387aac20b;Tbv_Alertas_Inteligentes;;
58c86b3e-e1b2-46e5-9acf-43335de1c58d;TBE_VS_OPERACOES;;
89c33fb6-dce9-4097-9be8-f01d502cc11b;Tbl_Server_Admin_Creator;;
306dac3b-a377-451f-9283-c7be3533e02f;Tbv_Vs_Canais_Nao_Proprietarios;;
9259961c-3ca7-4c1a-9c44-374a4555c270;Tbe_Vs_Canais_Nao_Proprietarios;;
6ed1b848-3206-4723-8b3b-7721a9869f53;Tbe_VS_Financeiro;;
701a819f-f176-4807-ad2c-572b970a9f8f;Tbv_VS_Financeiro;;
232613c8-9129-493c-b2af-a65c1d82d88a;Tbe_VS_Consumidor_CRM;;
c9346a0e-4f7a-4e53-95b4-71d7ef4c4e3b;Tbe_Vs_Demanda_e_Abastecimento;;
f8345037-4153-4303-bdb7-39ca3bee32ee;QlikSense_Sustent_BI;;
但正如您在上面看到的,我无法获得@siteRole 和@grantLicenseMode 的值,它们都在子节点“import”上。
解决方案
我建议:
xmlstarlet select -N x="http://tableau.com/api" --text --template \
--match "//x:tsResponse/x:groups/x:group" \
--value-of "concat(@id,',',@name,',',x:import/@siteRole,',',x:import/@grantLicenseMode)" \
-n file.xml
输出:
74c29008-7550-11eb-94d7-73020b27aff3,Todos os usuários,,
e392c24a-535d-4e78-8463-0a492d61c317,Tbv_Vs_Operacoes,Viewer,onLogin
6c236376-aa1b-451e-8b63-488387aac20b,Tbv_Alertas_Inteligentes,Viewer,onLogin
58c86b3e-e1b2-46e5-9acf-43335de1c58d,TBE_VS_OPERACOES,ExplorerCanPublish,onLogin
89c33fb6-dce9-4097-9be8-f01d502cc11b,Tbl_Server_Admin_Creator,SiteAdministratorExplorer,onLogin
306dac3b-a377-451f-9283-c7be3533e02f,Tbv_Vs_Canais_Nao_Proprietarios,Viewer,onSync
9259961c-3ca7-4c1a-9c44-374a4555c270,Tbe_Vs_Canais_Nao_Proprietarios,Explorer,onSync
看:xmlstarlet select --help
推荐阅读
- sql - 有编译器问题以及游标问题的声明?
- mysql - 从另一个表创建具有多个 SUM 的新表
- c++ - 如何通过索引访问数据
- ssis - 在 SSIS 2019 中面临查找转换的问题
- python - 如何让我的代码返回网格中可用的每个字符串?
- reactjs - 带 setTimeout 的 onClick 事件的高级时间(以毫秒为单位)
- python-3.x - Python,TypeError:缺少 1 个必需的位置参数。仅在使用 ThreadPoolExcecutor 的提交功能时
- android - 改造 - 不记名令牌
- reactjs - 从 React 向 Django 发送 post 请求时出现 400(错误请求)
- nativescript - NativeScript:卸载 macOS + Android 开发环境