Преобразование XML в CSV с xmlstarlet безуспешно - PullRequest
0 голосов
/ 16 марта 2020

У меня есть 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"

Мне просто нужен документ с разделителями табуляции из текущего, чтобы я мог импортировать его в другой менеджер паролей. У меня есть сотни записей, которые я действительно хотел бы не перепечатывать.

Может кто-нибудь помочь?

1 Ответ

0 голосов
/ 16 марта 2020

Длинный и запутанный ответ: вам нужно использовать что-то вроде

xml sel -T \
  -t -m '//system' \
     -v '@name' \
     -o ' ' \
     -v './username' \
     -o ' ' \
     -v './password' \
     -o ' ' \
     -v './note' \
     -o ' ' \
     -v './url' \
-n file.xml

, которое, исходя из ваших xml, выдает:

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

Чем короче (и лучше, imho) ответ использует что-то более продвинутое, например xidel.

...