@thefunv

Как реализовать парсинг XML с помощью shell и запись в csv формат?

Добрый день.

Мне необходимо стандартными средствами shell распарсить следующий xml документ и вывести результат в а-ля csv формат:

<ns2:OperatorDefinition xmlns="urn:swift:saa:xsd:operatorprofile" xmlns:ns2="urn:swift:saa:xsd:impex:operator" xmlns:ns3="urn:swift:saa:xsd:unit" xmlns:ns4="urn:s
wift:saa:xsd:licenseddestination" xmlns:ns5="urn:swift:saa:xsd:operator">
    <ns2:Operator>
        <ns5:Identifier>
            <ns5:Name>IIvanov</ns5:Name>
        </ns5:Identifier>
        <ns5:Description>Ivanov, Ivan</ns5:Description>
        <ns5:OperatorType>HUMAN</ns5:OperatorType>
        <ns5:AuthenticationType>LOCAL</ns5:AuthenticationType>
        <ns5:Profile>
            <Name>PROFILE_1</Name>
        </ns5:Profile>
        <ns5:Unit>
            <ns3:Name>None</ns3:Name>
        </ns5:Unit>
        <ns5:Unit>
            <ns3:Name>Custody</ns3:Name>
        </ns5:Unit>
    </ns2:Operator>
</ns2:OperatorDefinition>

<ns2:OperatorDefinition xmlns="urn:swift:saa:xsd:operatorprofile" xmlns:ns2="urn:swift:saa:xsd:impex:operator" xmlns:ns3="urn:swift:saa:xsd:unit" xmlns:ns4="urn:s
wift:saa:xsd:licenseddestination" xmlns:ns5="urn:swift:saa:xsd:operator">
    <ns2:Operator>
        <ns5:Identifier>
            <ns5:Name>PPetrov</ns5:Name>
        </ns5:Identifier>
        <ns5:Description>Petrov, Petr</ns5:Description>
        <ns5:OperatorType>HUMAN</ns5:OperatorType>
        <ns5:AuthenticationType>LOCAL</ns5:AuthenticationType>
        <ns5:Profile>
            <Name>PROFILE_2</Name>
        </ns5:Profile>
        <ns5:Unit>
            <ns3:Name>None</ns3:Name>
        </ns5:Unit>
    </ns2:Operator>
</ns2:OperatorDefinition>

Что я ожидаю увидеть:
IIvanov;Ivanov,Ivan;HUMAN;LOCAL;PROFILE_1
PPetrov;Petrov, Petr;HUMAN;LOCAL;PROFILE_2


Для решения задачи парсинга я воспользовался советом на stackoverflow: stackoverflow.com/questions/893585/how-to-parse-xm...
read_dom () {
    local IFS=\>
    read -d \< ENTITY CONTENT
}
while read_dom; do
    if [[ $ENTITY = "ns5:Name" ]] ; then
        echo $CONTENT
    fi
done < input.xml


Вопрос: как доработать скрипт, чтобы получить желанный результат?
  • Вопрос задан
  • 2902 просмотра
Пригласить эксперта
Ответы на вопрос 1
@axelll1
как-то так
egrep '||||' 1 | awk -F\> '{print $2}' | awk -F\< '{print $1}' | sed 's/$/;/g;:a;N;0~5!ba;s/\n//g;'

IIvanov;Ivanov, Ivan;HUMAN;LOCAL;PROFILE_1;
PPetrov;Petrov, Petr;HUMAN;LOCAL;PROFILE_2;

сначала грепаем нужные строки, потом отрезаем теги, следом ставим в конце всех строк точку с запятой и в результате объединяем по 5 строк в одну. Если последня точка с запятой не нужна, отрезаем ее.
Не чистый баш, но использовать можно
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы