mercoledì 28 gennaio 2009

validatore xml sotto linux con vim

Mi avrebbe evitato un'errore qualche giorno fa mentre testavo un parser di xml proprio perchè vim 7 non ha di default un formattatore e validatore di xml ma è molto semplice aggiungerne uno.

Inserendo in vimrc la seguente riga

vmap ,px !xmllint --format -<cr>

basta selezionare in modalità visuale ciò che si vuole verificare e digitare ',px' a questo punto se l'xml è valido viene formattato altrimenti segnala un errore e specifica anche il punto.

Quindi si passa da

<xml version="1.0" encoding="UTF-8" standalone="yes"> <message version="1" type="foo"> <metadata1> bla</metadata1> <metadata2> bla bla</metadata2> </message>

a

<xml version="1.0" encoding="UTF-8" standalone="yes">
<message version="1" type="foo">
<metadata1> bla</metadata1>
<metadata2> bla bla</metadata2>
</message>

ma se c'è un errore (ad esempio manca un '?' iniziale)

<xml version="1.0" encoding="UTF-8" standalone="yes"> <message version="1" type="foo"> <metadata1> bla</metadata1> <metadata2> bla bla</metadata2> </message>

otteniamo

-:1: parser error : attributes construct error
<xml version="1.0" encoding="UTF-8" standalone="yes"> <message version="1" type="" parser="" error="" couldn="" t="" find="" end="" of="" start="" tag="" xml="" line="" 1=""><xml version="1.0" encoding="UTF-8" standalone="yes"> <message version="1" type="" parser="" error="" extra="" content="" at="" end="" of="" the="" document=""><xml version="1.0" encoding="UTF-8" standalone="yes"> <message version="1" type="">

</message></xml></message></xml></message></xml></xml></cr><cr><xml version="1.0" encoding="UTF-8" standalone="yes"><xml version="1.0" encoding="UTF-8" standalone="yes"><message version="1" type="" parser="" error="" couldn="" t="" find="" end="" of="" start="" tag="" xml="" line="" 1=""><xml version="1.0" encoding="UTF-8" standalone="yes"><message version="1" type="" parser="" error="" extra="" content="" at="" end="" of="" the="" document=""><xml version="1.0" encoding="UTF-8" standalone="yes"><message version="1" type="">
</message></xml></me