2009-11-02 14 views
10

Aktualnie używam funkcji toprettyxml() modułu xml.dom w skrypcie pythona i mam pewne problemy z nowymi wierszami. Jeśli nie użyjesz parametru newl lub jeśli użyjesz toprettyxml (newl = '\ n'), to wyświetli on kilka nowych linii zamiast tylko jednego.Problem z nowymi liniami, gdy używam toprettyxml()

Na przykład

f = open(filename, 'w') 
f.write(dom1.toprettyxml(encoding='UTF-8')) 
f.close() 

wyświetlona:

<params> 


    <param name="Level" value="#LEVEL#"/> 


    <param name="Code" value="281"/> 


</params> 

Czy ktoś wie, gdzie problem jest i jak mogę go używać? FYI Używam Pythona 2.6.1

Odpowiedz

10

toprettyxml() jest dość okropny. Nie jest to kwestia systemu Windows i "\ r \ n". Wypróbowanie dowolnego ciągu jako parametru newl pokazuje, że dodawane jest zbyt wiele linii. Nie tylko to, ale także inne spacje (które mogą powodować problemy, gdy maszyna odczytuje xml) są również dodawane.

Niektóre obejścia dostępne w
http://ronrothman.com/public/leftbraned/xml-dom-minidom-toprettyxml-and-silly-whitespace

+1

dziękuję XV! Rzeczywiście, teraz staram się używać toprettyxml() jak najmniej, ale dobrze jest wiedzieć, że istnieje obejście tego irytującego problemu. I post jest bardzo przejrzysty. – PierrOz

-1

Czy przeglądasz wynikowy plik w systemie Windows? Jeśli tak, spróbuj użyć toprettyxml(newl='\r\n').

+0

rozwiązanie nie działa – Igal

1

Jeśli nie masz nic przeciwko instalowaniu nowych pakietów, spróbuj beautifulsoup. Miałem bardzo dobre doświadczenia z jego xml prettyfier.

4

toprettyxml(newl='') pracuje dla mnie na Windows.

+0

Praca na Ubuntu 16.04 (bash) też – renedet

4

znalazłem kolejny świetny rozwiązanie:

f = open(filename, 'w') 
dom_string = dom1.toprettyxml(encoding='UTF-8') 
dom_string = os.linesep.join([s for s in dom_string.splitlines() if s.strip()]) 
f.write(dom_string) 
f.close() 

Przede rozwiązanie zasadniczo usuwa niechciane znaki nowej linii z dom_string które są generowane przez toprettyxml().

Wejścia zaczerpnięte z ->What's a quick one-liner to remove empty lines from a python string?

+1

Dla python3 musi to być '' dom_string = b '\ n'.join ([s for s in dom_string.splitlines() if s.strip()]) '' ' –

0

Jest to dość stare pytanie, ale myślę, że wiem w czym jest problem:

Minidoms całkiem wydruku ma dość prostą metodę do przodu. Dodaje tylko znaki określone jako argumenty. Oznacza to, że będzie duplikować znaki, jeśli już istnieją.

E.g. Jeśli przeanalizujesz plik XML, który wygląda tak:

<parent> 
    <child> 
     Some text 
    </child> 
</parent> 

W domenie są już znaki nowej linii i wcięcia. Są one traktowane jako węzły tekstowe przez minidom i nadal istnieją, gdy parsujesz je w obiekcie domowym.

Jeśli teraz przejdziesz do konwersji obiektu dom w ciąg znaków XML, te węzły tekstowe nadal będą dostępne. Oznacza to, że nadal pozostają znaki nowego wiersza i tabulatory wcięcia. Używając teraz ładnego druku, po prostu dodamy więcej nowych linii i więcej kart. Dlatego w tym przypadku niestosowanie ładnego wydruku lub podanie wartości newl='' spowoduje pożądane wyjście.

Jednak generujesz dom w swoim skrypcie, węzły tekstowe tam nie będą, dlatego ładne drukowanie z newl='\r\n' i/lub addindent='\t' zakończy się całkiem ładnie.

TL; DR Wcięcia i nowe linie pozostają od analizowania i ładny nadruk tylko dodaje więcej

Powiązane problemy