Powiązane: Jak mogę ładnie wydrukować JSON w skrypcie powłoki (unix)?
Czy istnieje skrypt powłoki (unix) do formatowania XML w postaci czytelnej dla człowieka?
Zasadniczo chcę, aby przekształcić następujące:
<root><foo a="b">lorem</foo><bar value="ipsum" /></root>
... w coś takiego:
<root>
<foo a="b">lorem</foo>
<bar value="ipsum" />
</root>
xml
unix
command-line
svidgen
źródło
źródło
xmllint
dostępny w systemach Debian, musisz zainstalować pakietlibxml2-utils
(libxml2
nie zapewnia tego narzędzia, przynajmniej nie w Debianie 5.0 „Lenny” i 6.0 „Squeeze”).Odpowiedzi:
libxml2-utils
To narzędzie zawiera
libxml2-utils
:Perla
XML::Twig
To polecenie jest dostarczane z XML :: Twig perlmoduł, czasem
xml-twig-tools
pakiet:xmlstarlet
To polecenie zawiera
xmlstarlet
:tidy
Sprawdź
tidy
paczkę:Pyton
Python
xml.dom.minidom
może formatować XML (zarówno python2, jak i python3):saxon-lint
Potrzebujesz
saxon-lint
:saxon-HE
Potrzebujesz
saxon-HE
:źródło
echo '<xml .. />' | xmllint --some-read-from-stdn-option
?libxml2-utils
w moim pięknym ubuntu.UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 805: ordinal not in range(128)
w wersji python, chcesz zdefiniowaćPYTHONIOENCODING="UTF-8"
:cat some.xml | PYTHONIOENCODING="UTF-8" python -c 'import sys;import xml.dom.minidom;s=sys.stdin.read();print xml.dom.minidom.parseString(s).toprettyxml()' > pretty.xml
echo '<x></x><y></y>' | tidy -xml -iq
xmllint --format yourxmlfile.xml
xmllint to narzędzie XML wiersza polecenia, które jest zawarte w
libxml2
( http://xmlsoft.org/ ).================================================
Uwaga: Jeśli nie masz
libxml2
zainstalowanego programu, możesz go zainstalować, wykonując następujące czynności:CentOS
Ubuntu
sudo apt-get install libxml2-utils
Cygwin
apt-cyg install libxml2
System operacyjny Mac
Aby zainstalować to na MacOS z Homebrew, po prostu wykonaj:
brew install libxml2
Git
Dostępne również w Git, jeśli chcesz kod:
git clone git://git.gnome.org/libxml2
źródło
sudo apt-get install libxml2-utils
git
do pobrania dla systemu Windows instaluje nawet najnowszą wersjęxmllint
. Przykład:"C:\Program Files\Git\usr\bin\xmllint.exe" --format [email protected] > [email protected]
Możesz także użyć tidy , który może wymagać instalacji w pierwszej kolejności (np. Na Ubuntu: sudo
apt-get install tidy
).W tym celu wydasz coś takiego:
Uwaga: ma wiele dodatkowych flag czytelności, ale zawijanie słów jest nieco denerwujące, aby je rozplątać ( http://tidy.sourceforge.net/docs/quickref.html ).
źródło
tidy
też działa dobrze dla mnie. W przeciwieństwie dohxnormalize
tego zrobione faktycznie zamyka<body>
tag.tidy --indent yes --indent-spaces 4 --indent-attributes yes --wrap-attributes yes --input-xml yes --output-xml yes < InFile.xml > OutFile.xml
.alias prettyxml='tidy --indent yes --indent-spaces 4 --indent-attributes yes --wrap-attributes yes --input-xml yes --output-xml yes | pygmentize -l xml'
a potem mogęcurl url | prettyxml
Nie wspomniałeś o pliku, więc zakładam, że chcesz podać ciąg XML jako standardowe wejście w wierszu poleceń. W takim przypadku wykonaj następujące czynności:
źródło
Bez instalowania czegokolwiek na macOS / większość Uniksa.
Posługiwać się
tidy
cat filename.xml | tidy -xml -iq
Przekierowanie przeglądania pliku z cat do uporządkowania z określeniem typu pliku xml i do wcięcia podczas cichego wyświetlania spowoduje usunięcie błędu. JSON współpracuje również z
-json
.źródło
cat
krok:tidy -xml -iq filename.xml
. Możesz nawet zrobić,tidy -xml -iq filename.xml
używając-m
opcji zmodyfikowania oryginalnego pliku ...xmllint obsługuje formatowanie w miejscu :
Jak napisał Daniel Veillard:
Poziom wcięcia jest kontrolowany przez
XMLLINT_INDENT
zmienną środowiskową, która domyślnie ma 2 spacje. Przykład zmiany wcięcia na 4 spacje:Może brakować
--recover
opcji, gdy dokumenty XML są uszkodzone. Lub wypróbuj słaby parser HTML ze ścisłym wyjściem XML:--nsclean
,--nonet
,--nocdata
,--noblanks
Itd mogą być użyteczne. Przeczytaj stronę podręcznika man.źródło
To zajęło mi wieczność, aby znaleźć coś, co działa na moim komputerze Mac. Oto, co zadziałało dla mnie:
źródło
Chciałbym dodać czyste rozwiązanie Bash, ponieważ nie jest to „trudne” po prostu zrobić to ręcznie, a czasami nie chcesz instalować dodatkowego narzędzia do wykonania tego zadania.
Wklej go do pliku skryptu i potokuj w pliku xml. Zakłada się, że xml jest w jednym wierszu i nigdzie nie ma żadnych dodatkowych spacji. Można łatwo dodać dodatkowe
\s*
do wyrażeń regularnych, aby to naprawić.źródło