[BASH] - wyciąganie wartości z XML

0

Cześć,

Mam xml wyciągniętego z curl -X PROPFIND który wygląda tak jak poniżej (wyciągnąłem jedną linię:

<D:href>http://server.domain:80/WebDAV/repository/default/</D:href><D:propstat><D:prop><D:displayname>default</D:displayname><D:alternate-URI-set/><D:creationdate>1970-01-01T00:00:00Z</D:creationdate><D:iscollection>1</D:iscollection><D:resourcetype><D:collection/></D:resourcetype><D:lockdiscovery/><D:group-membership/><D:getlastmodified>Mon, 09 Mar 2020 14:30:20 GMT</D:getlastmodified><D:supportedlock><D:lockentry><D:lockscope><D:exclusive/></D:lockscope><D:locktype><D:write/></D:locktype></D:lockentry></D:supportedlock><D:principal-URL><D:href>/</D:href></D:principal-URL><D:group-member-set/></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>

żeby było czytelniej to poniżej wklejam ładnie sformatowane:

<D:response>
	<D:href>http://server.domain:80/WebDAV/repository/default/
	</D:href>
	<D:propstat>
		<D:prop>
			<D:displayname>default
			</D:displayname>
			<D:alternate-URI-set/>
			<D:creationdate>1970-01-01T00:00:00Z
			</D:creationdate>
			<D:iscollection>1
			</D:iscollection>
			<D:resourcetype>
				<D:collection/>
			</D:resourcetype>
			<D:lockdiscovery/>
			<D:group-membership/>
			<D:getlastmodified>Mon, 09 Mar 2020 14:30:20 GMT
			</D:getlastmodified>
			<D:supportedlock>
				<D:lockentry>
					<D:lockscope>
						<D:exclusive/>
					</D:lockscope>
					<D:locktype>
						<D:write/>
					</D:locktype>
				</D:lockentry>
			</D:supportedlock>
			<D:principal-URL>
				<D:href>/</D:href>
			</D:principal-URL>
			<D:group-member-set/>
		</D:prop>
		<D:status>HTTP/1.1 200 OK
		</D:status>
	</D:propstat>
</D:response>

Potrzebuję wyciągnąć z niego (najlepiej jednym zapytaniem) same wartości dla href, DisplayName, creadiondate i getlastmodified. Plik ma wiele wierszy i próbowałem to zrobić za pomocą pętli for gdzie i zawierałaby cały wiersz a potem to już po kolei sed -n '/.... ale dostawałem kupę błędów i stwierdziłem, że sam nie dam rady dojść jak to szybko ogarnąć więc proszę o pomoc tutaj.

0

Nie jest to idealne rozwiązanie, ale możliwe że będzie wystarczające dla ciebie:

#!/bin/bash
#script.sh

tags=( D:href D:displayname D:creationdate D:getlastmodified )

IFS=\>
while read -d \< readed_tag value; do
	for tag in ${tags[@]}; do
		if [[ $readed_tag = $tag ]];then
			echo "$tag: $value"
		fi
	done 
done

wywołujesz to np tak:

$ cat input1.xml | ./script.sh

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