Jak czytać i zapisywać pliki XML za pomocą kodu?

Jak czytać i zapisywać pliki XML za pomocą kodu?

Chcesz nauczyć się czytać i pisać plik XML z javy?





Pliki XML 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 czasami spotkać, dlatego ważne jest, aby nauczyć się z nim pracować na podstawie kodu.





Java Standard Edition (SE) zawiera Java API do przetwarzania XML (JAXP) , który jest ogólnym terminem obejmującym większość aspektów przetwarzania XML. Obejmują one:





  • OSĄD: Model obiektowy dokumentu zawiera klasy do pracy z artefaktami XML, takimi jak element, węzeł, atrybuty itp. Interfejs API DOM ładuje kompletny dokument XML do pamięci w celu przetworzenia, więc nie jest zbyt odpowiedni do pracy z dużymi plikami XML.
  • SAX: 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ż pozwala uniknąć ładowania całego dokumentu XML do pamięci, zapewnia architekturę typu pull, a nie architekturę sterowaną zdarzeniami, dzięki czemu aplikacja jest łatwiejsza do napisania i zrozumienia niż korzystanie z interfejsu SAX API.

W tym artykule używamy API DOM 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 :






Gambardella, Matthew
XML Developer's Guide
Computer
44.95
2000-10-01
An in-depth look at creating applications
with XML.


Ralls, 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:





ile pamięci RAM używa Google Chrome?
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = 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.

File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();

I to wszystko, ludzie! API DOM do odczytu 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 interfejsu 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.

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
Element book = (Element)child;
// work with the book Element here
}

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.

static private Node findFirstNamedElement(Node parent,String tagName)
{
NodeList children = parent.getChildNodes();
for (int i = 0, in = children.getLength() ; i Node child = children.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
if ( child.getNodeName().equals(tagName) )
return child;
}
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.

static private String getCharacterData(Node parent)
{
StringBuilder text = new StringBuilder();
if ( parent == null )
return text.toString();
NodeList children = parent.getChildNodes();
for (int k = 0, kn = children.getLength() ; k Node child = children.item(k);
if ( child.getNodeType() != Node.TEXT_NODE )
break;
text.append(child.getNodeValue());
}
return text.toString();
}

Uzbrojeni w te wygodne funkcje, przyjrzyjmy się teraz kodowi służącemu do wypisania 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.

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
Element book = (Element)child;
ii++;
String id = book.getAttribute('id');
String author = getCharacterData(findFirstNamedElement(child,'author'));
String title = getCharacterData(findFirstNamedElement(child,'title'));
String genre = getCharacterData(findFirstNamedElement(child,'genre'));
String price = getCharacterData(findFirstNamedElement(child,'price'));
String pubdate = getCharacterData(findFirstNamedElement(child,'pubdate'));
String descr = getCharacterData(findFirstNamedElement(child,'description'));
System.out.printf('%3d. book id = %s
' +
' author: %s
' +
' title: %s
' +
' genre: %s
' +
' price: %s
' +
' pubdate: %s
' +
' descr: %s
',
ii, id, author, title, genre, price, pubdate, descr);
}

Zapisywanie danych wyjściowych XML

Java zapewnia Interfejs 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
author=Jane Austen
title=Pride and Prejudice
genre=Romance
price=6.99
publish_date=2010-04-01
description='It is a truth universally acknowledged, that a single man in possession of a good fortune must be in want of a wife.' So begins Pride and Prejudice, Jane Austen's witty comedy of manners-one of the most popular novels of all time-that features splendidly civilized sparring between the proud Mr. Darcy and the prejudiced Elizabeth Bennet as they play out their spirited courtship in a series of eighteenth-century drawing-room intrigues.

Pierwszym krokiem jest parsowanie istniejącego pliku XML przy użyciu metody przedstawionej powyżej. Kod pokazano również poniżej.

File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = 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 = ...;
Properties props = new Properties();
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.

String id = props.getProperty('id');
String author = props.getProperty('author');
String title = props.getProperty('title');
String genre = props.getProperty('genre');
String price = props.getProperty('price');
String publish_date = props.getProperty('publish_date');
String descr = props.getProperty('description');

Stwórzmy teraz pustą książka element.

jak skopiować DVD na dysk twardy
Element book = document.createElement('book');
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.

List elnames =Arrays.asList('author', 'title', 'genre', 'price',
'publish_date', 'description');
for (String elname : elnames) {
Element el = document.createElement(elname);
Text text = document.createTextNode(props.getProperty(elname));
el.appendChild(text);
book.appendChild(el);
}
catalog.appendChild(book);

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();
Transformer tform = tfact.newTransformer();
tform.setOutputProperty(OutputKeys.INDENT, 'yes');
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, Wyjście systemu .

tform.transform(new DOMSource(document), new StreamResult(System.out));

Aby zapisać dane wyjściowe bezpośrednio do pliku, użyj następującego.

tform.transform(new DOMSource(document), new StreamResult(new File('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.

Udział Udział Ćwierkać E-mail Canon kontra Nikon: która marka aparatu jest lepsza?

Canon i Nikon to dwie największe marki w branży aparatów fotograficznych. Ale która marka oferuje lepszą gamę aparatów i obiektywów?

Czytaj dalej
Powiązane tematy
  • Programowanie
  • Jawa
O autorze Jay Śridhar(17 opublikowanych artykułów) Więcej od Jaya Sridhar

Zapisz się do naszego newslettera

Dołącz do naszego newslettera, aby otrzymywać porady techniczne, recenzje, bezpłatne e-booki i ekskluzywne oferty!

Kliknij tutaj, aby zasubskrybować