首页 > 解决方案 > 使用 xmlstarlet 将 XML 转换为 CSV 没有成功

问题描述

我有一个格式如下的 XML 文档:

<?xml version="1.0" encoding="UTF-8"?>
<appname version="2.3">
  <system name="web host">
    <username><![CDATA[username1]]></username>
    <password><![CDATA[password1]]></password>
    <note><![CDATA[]]></note>
    <url><![CDATA[]]></url>
  </system>
  <system name="vendor name">
    <username><![CDATA[username@email.com]]></username>
    <password><![CDATA[password2]]></password>
    <note><![CDATA[]]></note>
    <url><![CDATA[]]></url>
  </system>
  <system name="vendor name 3">
    <username><![CDATA[username@email.com]]></username>
    <password><![CDATA[password3]]></password>
    <note><![CDATA[]]></note>
    <url><![CDATA[]]></url>
  </system>
<appname>

我正在尝试使用:

xmlstarlet \
  sel -T -t -m /root/system \
  -v "concat(@name,',',username,',',password,',',note,',',url)" \
  -n filename.xml

我得到:

failed to load external entity "concat(@name,',',username,',',password,',',note,',',url)-n"

我只想要当前文档中的制表符分隔文档,以便将其导入另一个密码管理器。我有数百个条目,我真的不想重新输入。

任何人都可以帮忙吗?

标签: xmlcsvxmlstarlet

解决方案


使用西德尔:

xidel -s vendor.xml -e "/appname/system/join((./@name, ./username/text(), ./password/text()), x:cps(9))"

生产:

web host        username1       password1
vendor name     username@email.com      password2
vendor name 3   username@email.com      password3

感谢@Reino 提供打印 TAB 字符和 arg 位置的技巧。在 cmd.exe 和 Cygwin bash 上测试了引号。


推荐阅读