Widziałem sporą część niezgrabnego kodu XML-> JSON w sieci i po dłuższej interakcji z użytkownikami Stacka jestem przekonany, że ten tłum może pomóc więcej niż kilka pierwszych stron wyników Google.
Dlatego analizujemy kanał pogodowy i musimy umieszczać widżety pogodowe w wielu witrynach internetowych. Zajmujemy się teraz rozwiązaniami opartymi na języku Python.
Ten publiczny kanał RSS weather.com jest dobrym przykładem tego, co będziemy analizować ( nasz aktualny kanał weather.com zawiera dodatkowe informacje z powodu partnerstwa z nimi ).
Krótko mówiąc, w jaki sposób powinniśmy przekonwertować XML na JSON za pomocą Pythona?
xmltodict (pełne ujawnienie: napisałem to) może pomóc w konwersji twojego XML do struktury dict + lista + string, zgodnie z tym "standardem" . Jest oparty na Expat , więc jest bardzo szybki i nie wymaga ładowania całego drzewa XML do pamięci.
Gdy masz już tę strukturę danych, możesz serializować ją do formatu JSON:
źródło
bs4
może wykonać zadanie xml, aby dyktować, że korzystanie z biblioteki jest niezwykle łatweMożesz użyć biblioteki xmljson do konwersji przy użyciu różnych konwencji XML JSON .
Na przykład ten XML:
tłumaczy się poprzez konwencję BadgerFish na:
i poprzez konwencję GData do tego (atrybuty nie są obsługiwane):
... i poprzez konwencję Parkera do tego (atrybuty nie są obsługiwane):
Możliwe jest przekonwertowanie z XML na JSON iz JSON na XML przy użyciu tych samych konwencji:
Ujawnienie: napisałem tę bibliotekę. Mam nadzieję, że pomoże to przyszłym użytkownikom.
źródło
Jeśli kiedyś otrzymasz tylko kod odpowiedzi zamiast wszystkich danych, pojawi się błąd, taki jak json parse , więc musisz przekonwertować go na tekst
źródło
Oto kod, który do tego stworzyłem. Nie ma analizy zawartości, po prostu zwykła konwersja.
źródło
Istnieje metoda transportu znaczników opartych na XML jako JSON, która umożliwia bezstratną konwersję z powrotem do oryginalnej postaci. Zobacz http://jsonml.org/ .
To rodzaj XSLT w formacie JSON. Mam nadzieję, że będzie to dla ciebie pomocne
źródło
Dla każdego, kto może nadal tego potrzebować. Oto nowszy, prosty kod do wykonania tej konwersji.
źródło
Możesz zajrzeć na http://designtheory.org/library/extrep/designdb-1.0.pdf . Ten projekt zaczyna się od konwersji XML do JSON dużej biblioteki plików XML. Przeprowadzono wiele badań nad konwersją i stworzono najprostsze intuicyjne mapowanie XML -> JSON (zostało to opisane na początku dokumentu). Podsumowując, przekonwertuj wszystko na obiekt JSON i umieść powtarzające się bloki jako listę obiektów.
obiekty oznaczające pary klucz / wartość (słownik w Pythonie, hashmap w Javie, obiekt w JavaScript)
Nie ma odwzorowania z powrotem na XML, aby uzyskać identyczny dokument, powodem jest to, że nie wiadomo, czy para klucz / wartość była atrybutem, czy też atrybutem
<key>value</key>
, dlatego informacje te są tracone.Jeśli o mnie chodzi, atrybuty to dobry początek; potem znowu działały dobrze dla HTML.
źródło
Cóż, prawdopodobnie najprostszym sposobem jest po prostu przeanalizowanie XML do słowników, a następnie serializacja za pomocą simplejson.
źródło
Proponuję nie przechodzić na bezpośrednią konwersję. Przekonwertuj XML na obiekt, a następnie z obiektu na JSON.
Moim zdaniem daje to bardziej przejrzystą definicję tego, jak korespondują XML i JSON.
Potrzeba czasu, aby wszystko naprawić i możesz nawet napisać narzędzia, które pomogą Ci wygenerować część z nich, ale wyglądałoby to mniej więcej tak:
źródło
Znalazłem dla prostych wycinków XML, użycie wyrażenia regularnego pozwoliłoby uniknąć problemów. Na przykład:
Aby to zrobić za pomocą analizowania XML, jak powiedział @Dan, nie ma rozwiązania jednego dla wszystkich, ponieważ dane są różne. Proponuję użyć lxml. Chociaż nie jest gotowy do json, lxml.objectify daje ciche dobre wyniki:
źródło
Chociaż wbudowane biblioteki do analizowania XML są całkiem dobre, jestem zwolennikiem lxml .
Ale do analizowania kanałów RSS polecam Universal Feed Parser , który może również analizować Atom. Jego główną zaletą jest to, że jest w stanie strawić nawet większość zniekształconych pasz.
Python 2.6 już zawiera parser JSON, ale nowsza wersja o zwiększonej szybkości jest dostępna jako simplejson .
Dzięki tym narzędziom tworzenie aplikacji nie powinno być takie trudne.
źródło
Moja odpowiedź dotyczy konkretnego (i dość powszechnego) przypadku, w którym tak naprawdę nie musisz konwertować całego pliku xml na json, ale potrzebujesz przejść / uzyskać dostęp do określonych części xml i potrzebujesz, aby był szybki , i proste (przy użyciu operacji podobnych do json / dict).
Podejście
W tym celu należy zauważyć, że parsowanie XML do etree przy użyciu
lxml
jest bardzo szybkie. Powolną częścią większości innych odpowiedzi jest drugie przejście: przejście struktury etree (zwykle w python-land), konwersja do json.Co prowadzi mnie do podejścia, które znalazłem najlepsze w tym przypadku: analizowanie XML za pomocą
lxml
, a następnie owijanie węzłów etree (leniwie), zapewniając im interfejs podobny do dyktu.Kod
Oto kod:
Ta implementacja nie jest kompletna, np. Nie obsługuje czysto przypadków, w których element ma zarówno tekst, jak i atrybuty, lub zarówno tekst, jak i dzieci (tylko dlatego, że nie potrzebowałem go, kiedy go pisałem ...) Powinno być łatwe żeby go jednak ulepszyć.
Prędkość
W moim konkretnym przypadku użycia, w którym musiałem przetworzyć tylko określone elementy XML, to podejście dało zaskakujące i uderzające przyspieszenie o współczynnik 70 (!) W porównaniu z użyciem xmltodict @ Martina Blecha, a następnie przechodząc bezpośrednio przez dyktę .
Premia
Jako bonus, ponieważ nasza struktura jest już dyktowana, otrzymujemy kolejną alternatywną implementację
xml2json
za darmo. Musimy tylko przekazać naszą strukturę podobną do dyktowaniajson.dumps
. Coś jak:Jeśli Twój xml zawiera atrybuty, musisz użyć pewnych
attr_prefix
znaków alfanumerycznych (np. „ATTR_”), aby upewnić się, że klucze są prawidłowymi kluczami json.Nie testowałem tej części.
źródło
json.dumps(tree)
to zrobić , mówi, że obiekt typu „ETreeDictWrapper” nie jest możliwy do serializacji w formacie JSONKiedy robię cokolwiek z XML w Pythonie, prawie zawsze używam pakietu lxml. Podejrzewam, że większość ludzi używa lxml. Możesz użyć xmltodict, ale będziesz musiał zapłacić karę za ponowne przeanalizowanie XML.
Aby przekonwertować XML na json za pomocą lxml, należy:
W swoich projektach używam następującej klasy. Użyj metody toJson.
Dane wyjściowe z wbudowanego main to:
Co jest transformacją tego XML:
źródło
jsonpickle lub jeśli używasz parsera kanałów, możesz spróbować feed_parser_to_json.py
źródło
To tutaj jest aktywnie rozwijane i jak dotąd jest moim ulubionym: xml2json w Pythonie
źródło
sprawdź lxml2json (ujawnienie: napisałem)
https://github.com/rparelius/lxml2json
jest bardzo szybki, lekki (wymaga tylko lxml), a jedną z zalet jest to, że masz kontrolę nad tym, czy niektóre elementy są konwertowane na listy lub dykty
źródło
Możesz użyć declxml. Posiada zaawansowane funkcje, takie jak wiele atrybutów i złożona obsługa zagnieżdżonych. Wystarczy napisać do niego prosty procesor. Również z tym samym kodem możesz przekonwertować z powrotem na JSON. Jest to dość proste, a dokumentacja jest niesamowita.
Link: https://declxml.readthedocs.io/en/latest/index.html
źródło
Przygotuj dane w Pythonie : Aby utworzyć JSON , musisz najpierw przygotować dane w Pythonie. Do przygotowania danych możemy wykorzystać List i Dictionary w Pythonie.
Lista Pythona <==> Tablica JSON
Słownik Pythona <==> Obiekt JSON (format wartości klucza) Zaznacz, aby uzyskać więcej informacji
https://devstudioonline.com/article/create-json-and-xml-in-python
źródło
Aby przedstawić dane w formacie JSON
W json reprezentujemy dane w formacie klucza i wartości
Aby przedstawić dane w formacie XML
źródło