Reklama
Chcesz nauczyć się czytać i pisać plik XML z javy?
pliki XML Co to jest plik XML i jak można go otworzyć i używać?Być może widziałeś termin „XML”. Być może nawet przypadkowo otworzyłeś plik XML. Co to jest XML i jak go używać? Czytaj więcej są wykorzystywane do różnych celów, w tym do przechowywania danych. Zanim JSON stał się popularny, XML był preferowanym formatem do reprezentowania, przechowywania i transportu danych strukturalnych. Mimo że popularność XML spadła w ostatnich latach, możesz się z nim od czasu do czasu spotkać, dlatego ważne jest, aby nauczyć się z nim pracować na podstawie kodu.
Java Standard Edition (SE) 10 podstawowych pojęć związanych z Javą, których powinieneś się nauczyć na początkuNiezależnie od tego, czy piszesz GUI, tworzysz oprogramowanie po stronie serwera, czy aplikację mobilną na Androida, nauka Java będzie Ci dobrze służyć. Oto kilka podstawowych pojęć związanych z Javą, które pomogą Ci zacząć. Czytaj więcej zawiera Java API do przetwarzania XML (JAXP), który jest ogólnym terminem obejmującym większość aspektów przetwarzania XML. Obejmują one:
- DOM: Model obiektowy dokumentu zawiera klasy do pracy z artefaktami XML, takimi jak element, węzeł, atrybuty itp. Interfejs API DOM ładuje cały dokument XML do pamięci w celu przetworzenia, więc nie jest odpowiedni do pracy z dużymi plikami XML.
- SAKS: Simple API for XML to oparty na zdarzeniach algorytm do odczytu XML. Tutaj XML jest przetwarzany przez uruchamianie zdarzeń znalezionych podczas odczytu XML. Wymagania dotyczące pamięci do korzystania z tej metody są niskie, ale praca z API jest bardziej złożona niż praca z DOM.
- Stax: Streaming API for XML jest najnowszym dodatkiem do interfejsów API XML i zapewnia wysokowydajne filtrowanie strumieni, przetwarzanie i modyfikację XML. Chociaż unika ładowania całego dokumentu XML do pamięci, zapewnia raczej architekturę typu pull niż architektura sterowana zdarzeniami, dzięki czemu aplikacja jest łatwiejsza do napisania i zrozumienia niż korzystanie z SAX API.
W tym artykule używamy DOM API aby zademonstrować, jak czytać i pisać pliki XML z javy. Pozostałe dwa interfejsy API omówimy w przyszłych artykułach.
Przykładowy plik XML
Na potrzeby tego artykułu demonstrujemy koncepcje za pomocą następującego przykładowego kodu XML, który można znaleźć tutaj:
1.0?>Gambardella, Mateusz Podręcznik programisty XML
Komputer 44.95 2000-10-01 Szczegółowe spojrzenie na tworzenie aplikacji za pomocą XML. Rajdy, Kim ...
Czytanie pliku XML
Przyjrzyjmy się podstawowym krokom wymaganym do odczytania pliku XML za pomocą DOM API.
Pierwszym krokiem jest uzyskanie instancji Kreator dokumentów. Konstruktor służy do analizowania dokumentów XML. Dla podstawowych zastosowań robimy to tak:
Fabryka DocumentBuilderFactory = DocumentBuilderFactory.newInstance(); fabryka.setNamespaceAware (fałsz); factory.setWalidacja (fałsz); Konstruktor DocumentBuilder = factory.newDocumentBuilder();
Możemy teraz załadować cały dokument do pamięci, zaczynając od elementu głównego XML. W naszym przykładzie jest to katalog element.
Plik plik =...; // Plik XML do odczytu. Dokument dokumentu = builder.parse (plik); Katalog elementów = document.getDocumentElement();
I to wszystko, ludzie! API DOM do odczytywania XML jest naprawdę proste. Masz teraz dostęp do całego dokumentu XML, zaczynając od jego elementu głównego, katalog. Zobaczmy teraz, jak z nim pracować.
Korzystanie z API DOM
Teraz, gdy mamy korzeń XML Element, możemy użyć API DOM do wyodrębnienia interesujących bryłek informacji.
Zdobądź wszystkie książka dzieci elementu głównego i wykonaj pętlę nad nimi. Zauważ, że pobierzWęzłyPodrzędne() zwroty wszystko dzieci, w tym tekst, komentarze itp. Do naszych celów potrzebujemy tylko elementów potomnych, więc pomijamy inne.
książki NodeList = katalog.getChildNodes(); for (int i = 0, ii = 0, n = books.getLength(); ja < n; i++) { Węzeł potomny = książki.pozycja (i); if ( child.getNodeType() != Węzeł. ELEMENT_NODE ) kontynuuj; Księga elementów = (element) dziecko; // praca z książką Element tutaj. }
Jak znaleźć konkretny element potomny, biorąc pod uwagę rodzica? Poniższa metoda statyczna zwraca pierwszy pasujący element, jeśli zostanie znaleziony, lub null. Jak widać, procedura polega na pobraniu listy węzłów podrzędnych i przejściu przez nie, wybierając węzły elementów o określonej nazwie.
statyczny prywatny Węzeł findFirstNamedElement (nadrzędny węzła, ciąg tagName) { NodeList dzieci = parent.getChildNodes(); for (int i = 0, in = children.getLength(); ja < w; i++) { Węzeł potomny = dzieci.pozycja (i); if ( child.getNodeType() != Węzeł. ELEMENT_NODE ) kontynuuj; if ( child.getNodeName().equals (tagName) ) zwraca dziecko; } return null; }
Zauważ, że DOM API traktuje treść tekstową w elemencie jako oddzielny węzeł typu TEXT_NODE. Ponadto treść tekstowa może zostać podzielona na wiele sąsiadujących ze sobą węzłów tekstowych. Dlatego do pobrania treści tekstowej w elemencie wymagane jest następujące specjalne przetwarzanie.
statyczny prywatny String getCharacterData (rodzic węzła) { StringBuilder tekst = nowy StringBuilder(); if ( parent == null ) return text.toString(); NodeList dzieci = parent.getChildNodes(); for (int k = 0, kn = dzieci.getLength(); k < kn; k++) { Węzeł potomny = dzieci.pozycja (k); if ( child.getNodeType() != Węzeł. TEXT_NODE ) przerwa; text.append (child.getNodeValue()); } return text.toString(); }
Uzbrojeni w te wygodne funkcje, przyjrzyjmy się teraz kodowi służącemu do wylistowania niektórych informacji z naszego przykładowego kodu XML. Chcielibyśmy pokazać szczegółowe informacje dla każdej książki, takie jak byłyby dostępne w katalogu książek.
książki NodeList = katalog.getChildNodes(); for (int i = 0, ii = 0, n = books.getLength(); ja < n; i++) { Węzeł potomny = książki.pozycja (i); if ( child.getNodeType() != Węzeł. ELEMENT_NODE ) kontynuuj; Księga elementów = (element) dziecko; ii++; Identyfikator ciągu = book.getAttribute("id"); Autor ciągu = getCharacterData (znajdźFirstNamedElement (dziecko, "autor")); String title = getCharacterData (znajdźFirstNamedElement (dziecko, "tytuł")); Gatunek ciągu = getCharacterData (znajdźFirstNamedElement (dziecko,"gatunek")); Cena ciągu = getCharacterData (znajdźFirstNamedElement (dziecko, "cena")); String pubdate = getCharacterData (znajdźFirstNamedElement (dziecko,"pubdate")); String descr = getCharacterData (znajdźFirstNamedElement (dziecko, "opis")); System.out.printf("%3d. id książki = %s\n" + " autor: %s\n" + " tytuł: %s\n" + " gatunek: %s\n" + " cena: %s\n" + " data publikacji: %s \n" + " opis: %s\n", ii, id, autor, tytuł, gatunek, cena, data publikacji, opis); }
Zapisywanie danych wyjściowych XML
Java zapewnia API transformacji XML do przekształcania danych XML. Używamy tego API z transformacja tożsamości do generowania danych wyjściowych.
Jako przykład dodajmy nowy książka element do przykładowego katalogu przedstawionego powyżej. Szczegóły książki (takie jak autor, tytułitp.) można uzyskać zewnętrznie, na przykład z pliku właściwości lub bazy danych. Do załadowania danych używamy następującego pliku właściwości.
id=bk113. autor=Jane Austen. title=Duma i uprzedzenie. gatunek=Romans. cena=6,99. data_publikacji=2010-04-01. description="Jest powszechnie uznaną prawdą, że samotnemu mężczyźnie, który ma szczęście, musi brakować żony." Tak zaczyna się duma i Uprzedzenie, dowcipna komedia obyczajowa Jane Austen – jedna z najpopularniejszych powieści wszech czasów – przedstawiająca wspaniale ucywilizowane sparingi między dumny pan Darcy i uprzedzona Elizabeth Bennet, gdy rozgrywają swoje porywające zaloty w serii osiemnastowiecznych salonów machinacje.
Pierwszym krokiem jest parsowanie istniejącego pliku XML przy użyciu metody przedstawionej powyżej. Kod pokazano również poniżej.
Plik plik =...; // Plik XML do odczytu. Dokument dokumentu = builder.parse (plik); Katalog elementów = document.getDocumentElement();
Wczytujemy dane z pliku właściwości za pomocą Nieruchomości klasa dostarczana z javą. Kod jest dość prosty i pokazany poniżej.
String propsFile =...; Właściwości rekwizyty = nowe Właściwości(); try (FileReader in = new FileReader (propsFile)) { props.load (in); }
Po załadowaniu właściwości pobieramy wartości, które chcemy dodać z pliku właściwości.
Identyfikator ciągu = props.getProperty("id"); Autor ciągu = props.getProperty("autor"); Tytuł napisu = props.getProperty("tytuł"); Gatunek łańcucha = props.getProperty("gatunek"); Cena ciągu = props.getProperty("cena"); Ciąg data_publikacji = props.getProperty("data_publikacji"); String descr = props.getProperty("opis");
Stwórzmy teraz pustą książka element.
Księga elementów = document.createElement("książka"); book.setAttribute("id", id);
Dodawanie elementów podrzędnych do książka jest trywialne. Dla wygody zbieramy wymagane nazwy elementów w a Lista i dodaj wartości w pętli.
Listaelnames =Arrays.asList("autor", "tytuł", "gatunek", "cena", "data_publikacji", "opis"); for (String elname: elnames) { Element el = document.createElement (elname); Tekst tekstowy = document.createTextNode (props.getProperty (elname)); el.appendChild (tekst); book.appendDziecko (el); } katalog.appendChild (książka);
I tak to się robi. ten katalog element ma teraz nowy książka dodany element. Teraz pozostaje tylko napisać zaktualizowany kod XML.
Do pisania XML potrzebujemy instancji Transformator który jest tworzony jak pokazano poniżej. Zauważ, że żądamy wcięcia wyjściowego XML za pomocą setOutputProperty() metoda.
TransformerFactory tfact = TransformerFactory.newInstance(); Transformator tform = tfact.newTransformer(); tform.setOutputProperty (Klucze wyjściowe. Wcięcie, „tak”); tform.setOutputProperty("{ http://xml.apache.org/xslt}indent-amount", "3");
Ostatnim krokiem w generowaniu danych wyjściowych XML jest zastosowanie transformacji. Wynik pojawia się w strumieniu wyjściowym, System.out.
tform.transform (nowy DOMSource (dokument), nowy StreamResult (System.out));
Aby zapisać dane wyjściowe bezpośrednio do pliku, użyj następującego.
tform.transform (nowy DOMSource (dokument), nowy StreamResult (nowy plik("output.xml")));
I to kończy ten artykuł o odczytywaniu i zapisywaniu plików XML za pomocą interfejsu API DOM.
Czy korzystałeś z DOM API w swoich aplikacjach? Jak to się sprawdziło? Daj nam znać w komentarzach poniżej.