Jaki jest najlepszy sposób (lub różne sposoby) ładnego drukowania XML w Pythonie?
python
xml
pretty-print
Hortitude
źródło
źródło
lxml jest aktualny, zaktualizowany i zawiera ładną funkcję drukowania
Sprawdź samouczek lxml: http://lxml.de/tutorial.html
źródło
aptitude install
daleko. W OS / X nie jestem pewien.print(etree.tostring(x, pretty_print=True, encoding="unicode"))
. Zapis do pliku wyjściowego jest możliwy tylko w jednym wierszu, nie jest wymagana zmienna pośrednia:etree.parse("filename").write("outputfile", encoding="utf-8")
Innym rozwiązaniem jest pożyczenie tej
indent
funkcji do użytku z biblioteką ElementTree, która jest wbudowana w Python od wersji 2.5. Oto jak by to wyglądało:źródło
tree.write([filename])
zapisywanie do pliku (tree
będąc instancją ElementTree).tree = ElementTree.parse('file) ; root = tree.getroot() ; indent(root); tree.write('Out.xml');
Oto moje (hacky?) Rozwiązanie obejścia brzydkiego problemu z węzłem tekstowym.
Powyższy kod wygeneruje:
Zamiast tego:
Oświadczenie: Prawdopodobnie istnieją pewne ograniczenia.
źródło
re.compile
przedsub
operacją (użyłemre.findall()
dwa razyzip
ifor
pętli zstr.replace()
...)Jak zauważyli inni, lxml ma wbudowaną ładną drukarkę.
Pamiętaj jednak, że domyślnie zmienia sekcje CDATA na normalny tekst, co może mieć nieprzyjemne wyniki.
Oto funkcja Pythona, która zachowuje plik wejściowy i zmienia tylko wcięcia (zwróć uwagę na
strip_cdata=False
). Ponadto upewnia się, że dane wyjściowe wykorzystują kodowanie UTF-8 zamiast domyślnego ASCII (zwróć uwagę naencoding='utf-8'
):Przykładowe użycie:
źródło
BeautifulSoup ma łatwą w użyciu
prettify()
metodę.Wcina jedno miejsce na poziom wcięcia. Działa znacznie lepiej niż ładna wersja lxml i jest krótka i słodka.
źródło
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: xml. Do you need to install a parser library?
Jeśli masz
xmllint
, możesz odrodzić podproces i użyć go.xmllint --format <file>
pretty-wypisuje wejściowy XML na standardowe wyjście.Zauważ, że ta metoda wykorzystuje program zewnętrzny do Pythona, co czyni z niej rodzaj włamania.
źródło
Próbowałem edytować odpowiedź „ade” powyżej, ale przepełnienie stosu nie pozwoliło mi na edycję po tym, jak początkowo dostarczyłem anonimową informację zwrotną. Jest to mniej błędna wersja funkcji do wydrukowania ElementTree.
źródło
Jeśli używasz implementacji DOM, każda z nich ma swoją własną wbudowaną formę ładnego drukowania:
Jeśli używasz czegoś innego bez własnej ładnej drukarki - lub te ładne drukarki nie robią tego tak, jak chcesz - prawdopodobnie będziesz musiał napisać lub podklasować własny serializator.
źródło
Miałem pewne problemy z ładnym nadrukiem minidoma. Otrzymywałbym błąd Unicode za każdym razem, gdy próbowałem ładnie wydrukować dokument ze znakami spoza podanego kodowania, np. Gdybym miał β w dokumencie i próbowałem
doc.toprettyxml(encoding='latin-1')
. Oto moje obejście tego:źródło
Nie doda spacji ani nowych linii w węzłach tekstowych, chyba że poprosisz o to za pomocą:
Możesz określić, jaka powinna być jednostka wcięcia i jak powinna wyglądać nowa linia.
Dokument znajduje się na stronie głównej http://www.yattag.org .
źródło
Napisałem rozwiązanie, aby przejść przez istniejący ElementTree i użyć tekstu / ogona, aby wprowadzić wcięcie zgodnie z oczekiwaniami.
źródło
Ładny wydruk XML dla Pythona wygląda całkiem dobrze do tego zadania. (Również odpowiednio nazwany.)
Alternatywą jest użycie pyXML , który ma funkcję PrettyPrint .
źródło
HTTPError: 404 Client Error: Not Found for url: https://pypi.org/simple/xmlpp/
Pomyśl, że ten projekt jest obecnie na poddaszu, wstyd.Oto rozwiązanie Python3, które pozbywa się brzydkiego problemu nowej linii (tony białych znaków) i wykorzystuje tylko standardowe biblioteki, w przeciwieństwie do większości innych implementacji.
Tutaj dowiedziałem się, jak rozwiązać typowy problem nowej linii .
źródło
Możesz użyć popularnej biblioteki zewnętrznej xmltodict ,
unparse
apretty=True
uzyskasz najlepszy wynik:full_document=False
przeciwko<?xml version="1.0" encoding="UTF-8"?>
na górze.źródło
Spójrz na moduł vkbeautify .
Jest to wersja Pythona mojej bardzo popularnej wtyczki javascript / nodejs o tej samej nazwie. Może ładnie drukować / zmniejszać tekst XML, JSON i CSS. Dane wejściowe i wyjściowe mogą być ciągiem / plikiem w dowolnej kombinacji. Jest bardzo kompaktowy i nie ma żadnej zależności.
Przykłady :
źródło
Alternatywą, jeśli nie chcesz przeprowadzać ponownej analizy, jest biblioteka xmlpp.py z
get_pprint()
funkcją. Działa ładnie i płynnie w moich przypadkach użycia, bez konieczności ponownej analizy obiektu lxml ElementTree.źródło
Możesz wypróbować tę odmianę ...
Zainstaluj
BeautifulSoup
ilxml
biblioteki zaplecza (analizatora składni):Przetwarzaj dokument XML:
źródło
'lxml'
używa parsera HTML lxml - patrz dokumentacja BS4 . Potrzebujesz'xml'
lub'lxml-xml'
do analizatora składni XML.lxml’s XML parser BeautifulSoup(markup, "lxml-xml") BeautifulSoup(markup, "xml")
lxml-xml
), a następnie przystąpił do głosowania tego samego dnia. Złożyłem oficjalną skargę do S / O, ale odmówili przeprowadzenia dochodzenia. Zresztą od tamtej pory „zmanipulowałem” moją odpowiedź, która teraz jest znowu poprawna (i określa,lxml-xml
jak pierwotnie). Dziękuję Ci.Miałem ten problem i rozwiązałem go w następujący sposób:
W moim kodzie ta metoda nazywa się tak:
Działa to tylko dlatego, że etree domyślnie używa
two spaces
wcięć, które nie bardzo podkreślają wcięcia i dlatego nie są ładne. Nie mogłem określić żadnego ustawienia etree ani parametru dla dowolnej funkcji, aby zmienić standardowe wcięcie etree. Lubię, jak łatwo jest używać etree, ale to mnie naprawdę denerwowało.źródło
Do konwersji całego dokumentu xml do ładnego dokumentu xml
(np. Zakładając, że rozpakowałeś [rozpakowany] plik .odt lub .ods LibreOffice Writer i chcesz przekonwertować brzydki plik „content.xml” na ładny dla zautomatyzowana kontrola wersji git i
git difftool
ing plików .odt / .ods , takich jak ja tutaj wdrażam )Odniesienia:
- Dzięki odpowiedzi Bena Nolanda na tej stronie, która zapewniła mi najwięcej możliwości.
źródło
Działa dobrze dla xml z chińskim!
źródło
Jeśli z jakiegoś powodu nie możesz zdobyć żadnego z modułów Pythona, o których wspominali inni użytkownicy, sugeruję następujące rozwiązanie dla Python 2.7:
O ile wiem, to rozwiązanie będzie działać na systemach opartych na Uniksie, które mają
xmllint
zainstalowany pakiet.źródło
check_output
ponieważ nie trzeba sprawdzać błędówRozwiązałem to za pomocą kilku wierszy kodu, otwierając plik, przeglądając go i dodając wcięcia, a następnie zapisując go ponownie. Pracowałem z małymi plikami xml i nie chciałem dodawać zależności ani więcej bibliotek do zainstalowania dla użytkownika. W każdym razie oto, z czym skończyłem:
To działa dla mnie, być może ktoś z niej skorzysta :)
źródło