2012-07-23 19 views

Odpowiedz

8

Spróbuj tego, to nie jest piękne, ale to działa :)

prostu wymazać linie zawierające > z stdout, przeciąć łańcuch dostać drugą część po = i usuwać "

test=$(echo 'cat //body/value/@name' | xmllint --shell "test.xml" | grep -v ">" | cut -f 2 -d "=" | tr -d \"); 
echo $test 
+2

Zastosowanie xmllint, dzięki czemu nie trzeba używać do analizowania XML Res. Zdaj sobie sprawę, że musisz użyć REs, aby przeanalizować wyjście z xmllint. – badp

+0

dlaczego to drukuje ------- przed wartością atrybutu nazwy? jak go usunąć? –

23

Należy użyć wartości fn:string(), która zwróci wartość jej argumentu jako xs:string. W przypadku, gdy jego argument jest atrybutem, zwróci wartość atrybutu jako xs:string.

test=$(xmllint --xpath "string(//body/value/@name)" test.xml) 
+8

Niestety --xpath nie jest obsługiwana w wielu instalacjach – Fergie

+0

http://stackoverflow.com/questions/11975862/xmllint-unknown-option-xpath – Dejan

+5

To pokazuje tylko wartość dla jednego elementu, czy możliwe jest uzyskanie wielu dopasowań ? –

4

Niedawno miałem do portu mój oryginalny prostsze rozwiązanie przy użyciu --xpath do platformy brakuje tej funkcji, więc musiał przyjąć rozwiązanie „Cat” też. To zajmie się wieloma dopasowaniami testowanymi na Ubuntu 12.04 i Solaris 11:

getxml() { # $1 = xml file, $2 = xpath expression 
    echo "cat $2" | xmllint --shell $1 |\ 
    sed -n 's/[^\"]*\"\([^\"]*\)\"[^\"]*/\1/gp' 
} 

np. wyodrębnianie nazw instancji z GlassFish konfiguracji domeny:

$ getxml /tmp/test.xml "//server[@node-ref]/@name" 
inst1 
inst2 

sed post-processing prostu chwyta wszystkie podane wartości, które było wystarczające dla moich potrzeb (Getting bity GlassFish config).

3

Podejście z pomocnika awk polecenia obsługującym wiele atrybutów (uproszczony wersja ego's approach):

echo 'cat //*/@name' | xmllint --shell file | awk -F\" 'NR % 2 == 0 { print $2 }' 

awk polecenia:

  • Dzieli xmllint „s wyjście linie w pola przez " znaków. (-F\")

    • Uwaga że xmllint normalizuje powołując się wokół wartości atrybutów do "..." na wyjściu, nawet jeśli wejście miał '...', więc jest to wystarczające, aby podzielić przez ".
  • tylko procesy parzyste linie (NR %2 == 0), przez filtrowanie linii separatora cat niezmiennie drukuje.

  • print $2 Następnie drukuje tylko 2. pole, które jest wartością każdego atrybutu bez otaczania "...".

Zakładając Poniższy przykładowy XML w file:

<body> 
    <value name="abc"></value> 
    <value name="def"></value> 
</body> 

powyższe plony:

abc 
def 
+0

to działa idealnie dla mnie, dzięki. Czy masz również dobry sposób na przypisanie wartości do różnych zmiennych. Podobnie jak VAR_1 = $ (echo 'cat // */@ name' | xmllint - plik shella | awk -F \ "'NR% 2 == 0 {print $ 2}')? – dieHellste

+0

@dieHellste: Możesz" odczytać " linie wyjściowe do zmiennych (albo w pętli 'while', albo w Bash, do tablicy z' read -a'); jeśli potrzebujesz dalszych wskazówek, zadaj nowe pytanie. – mklement0

Powiązane problemy