Linux-parsowanie xml

0

Cześć,
Potrzebuję z takiego fragmentu xml:

<pogo:lista>
    <pogo:Entry>
      <pogo:Active:>false</pogo:Active>
      <pogo:Value:>3</pogo:Value>
    </pogo:Entry>
    <pogo:Entry>
      <pogo:Active:>true</pogo:Active>
      <pogo:Value:>4</pogo:Value>
    </pogo:Entry>
</pogo:lista>

Za pomocą Shella w linux zsumować dane z taga Value gdzie active jest na true, Czyli w przypadku jak powyżej wynik powinien być równy 4 (jeden tag aktywny). Na ktoś pomysł jak to zrobić bez dodatkowych narzędzi w Linux??
Z góry bardzo dziękuję za pomoc

0

potrzebuję to wykonać bez xpath bo jakoś dziwnie ten xml jest sformatowany

0

Co jest w tym XMLu takiego dziwnego?

<pogo:lista>
    <pogo:entry>
        <pogo:active:>false
        </pogo:active>
        <pogo:value:>3
        </pogo:value>
    </pogo:entry>
    <pogo:entry>
        <pogo:active:>true
        </pogo:active>
        <pogo:value:>4
        </pogo:value>
    </pogo:entry>
</pogo:lista>

0

jak parsuje tego xml to mam info, że nie ma xpath

1

Ten XML jest niepoprawny.
Otwierasz tag: pogo:value```:```
i zamykasz </pogo:value>

0

to literówka, powinno być

<pogo:lista>
    <pogo:Entry>
      <pogo:Active>false</pogo:Active>
      <pogo:Value>3</pogo:Value>
    </pogo:Entry>
    <pogo:Entry>
      <pogo:Active>true</pogo:Active>
      <pogo:Value>4</pogo:Value>
    </pogo:Entry>
</pogo:lista>
2

W bashu się da, ale jest to droga na około...

#!/bin/bash
echo "<pogo:lista>\
    <pogo:Entry>\
      <pogo:Active>false</pogo:Active>\
      <pogo:Value>3</pogo:Value>\
    </pogo:Entry>\
    <pogo:Entry>\
      <pogo:Active>true</pogo:Active>\
      <pogo:Value>4</pogo:Value>\
    </pogo:Entry>\
   <pogo:Entry>\
      <pogo:Active>true</pogo:Active>\
      <pogo:Value>4</pogo:Value>\
    </pogo:Entry>\
</pogo:lista>" | tr -d " \n" | sed -e "s/<\/pogo:Active><pogo:Value>/#/g" | tr "><" "\n\n" | egrep -i "true" | sed -e "s/true#//g" | awk 'BEGIN{s=0} {s+=$1} END {print s}'

Możesz stopniowo dodawać kolejne polecenia po | i patrzeć jakie są kroki przetwarzania.

0

ok, właśnie o coś takiego mi chodziło, przetestuję to sobie. dziękuję

0

a kojarzy ktoś dlaczego mogę otrzymywać taki komunikat "argument list too long" przy długim xml?

1
student21 napisał(a):

a kojarzy ktoś dlaczego mogę otrzymywać taki komunikat "argument list too long" przy długim xml?

Kojarzy. :)

Podany skrypt (właściwie linijka) rozpakowuje Ci Twój XML do poszczególnych słów, a może być ich dużo. Z drugiej strony, linia poleceń w shellu ma ograniczoną liczbę możliwych argumentów i stąd ten komunikat.

Ale, szczerze mówiąc, przyjrzałem się podanemu przepisowi i nie wiem, gdzie tam może być za dużo argumentów... Może chodzi o samo echo? Prześledź (jak pisał @yarel) krok po kroku, wpisując do każdej | wyłącznie i patrz co się dzieje...

0

tak problem występuje już przy samych echo..

0

@student21: To zamiast echo "xml" spróbuj cat "plik", gdzie Twój XML będzie zapisany w pliku.

0

ten string dostaję jako odpowiedz z webservice więc musiałbym zapisywać za każdym razem do pliku wynik, wolałbym zapisywać go do zmiennej jak robię to obecnie..

1

Jak dostajesz jako odpowiedź, to może od razu przepuścić go przez potok:
serwis | tr ...

0

robię to w ansible więc muszę to wcześniej zapisać do zmiennej..

0

A na pewno nie możesz do pliku? Jakiś plik tymczasowy...

0

mogę, tylko komplikuje to sprawę bo za każdym razem trzeba będzie tworzyć nowy plik i go usuwać

0

To tak rób -- jeśli ne potok i ne echo, to nie widzę wyjścia... Jakiś interfejs plików tymczasowych może by załatwił to tworzenie i usuwanie...

1 użytkowników online, w tym zalogowanych: 0, gości: 1