Как да четете и пишете XML файлове с код

Как да четете и пишете XML файлове с код

Искате ли да научите как да четете и пишете XML файл от java?





XML файлове се използват за различни цели, включително съхранение на данни. Преди JSON да стане популярен, XML беше предпочитаният формат за представяне, съхраняване и транспортиране на структурирани данни. Въпреки че популярността на XML намалява през последните години, може да срещнете от време на време, така че е важно да се научите как да работите с него от кода.





Стандартното издание на Java (SE) включва Java API за XML обработка (JAXP) , което е общ термин, обхващащ повечето аспекти на XML обработката. Те включват:





  • РЕШЕНИЕ: Обектният модел на документа включва класове за работа с XML артефакти като елемент, възел, атрибути и т.н. DOM API зарежда пълния XML документ в паметта за обработка, така че не е много подходящ за работа с големи XML файлове.
  • SAX: Simple API за XML е управляван от събития алгоритъм за четене на XML. Тук XML се обработва чрез задействане на събития, открити при четене на XML. Изискванията за памет за използване на този метод са ниски, но работата с API е по -сложна от работата с DOM.
  • StAX: API за поточно предаване за XML е скорошно допълнение към XML API и осигурява високопроизводително поточно филтриране, обработка и модификация на XML. Въпреки че избягва зареждането на целия XML документ в паметта, той осигурява архитектура от типа pull, а не архитектура, управлявана от събития, така че приложението е по-лесно да се кодира и разбира, отколкото да се използва SAX API.

В тази статия използваме DOM API да демонстрира как да чете и пише XML файлове от java. В следващите статии ще разгледаме другите два API.

Примерен XML файл

За целите на тази статия ние демонстрираме концепциите, като използваме следния примерен XML, който може да бъде намерен тук :






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


Ralls, Kim
...

Четене на XML файл

Нека разгледаме основните стъпки, необходими за четене на XML файл с помощта на DOM API.

Първата стъпка е да получите екземпляр на DocumentBuilder . Конструкторът се използва за анализиране на XML документи. За основно използване го правим така:





защо тачпадът ми спря да работи
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

Вече можем да заредим целия документ в паметта, започвайки от основния елемент на XML. В нашия пример това е каталог елемент.

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

И това е, хора! DOM API за четене на XML е наистина прост. Вече имате достъп до целия XML документ, започвайки от основния му елемент, каталог . Нека сега да видим как да работим с него.





Използване на DOM API

Сега, когато имаме XML корен Елемент , можем да използваме DOM API за извличане на интересни частици информация.

Вземете всички Книга деца на коренния елемент и ги преместват. Отбележи, че getChildNodes () се завръща всичко деца, включително текст, коментари и т.н. За нашата цел се нуждаем само от детските елементи, така че прескачаме останалите.

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
}

Как намирате конкретен дъщерен елемент, предвид родителя? Следният статичен метод връща първия съвпадащ елемент, ако е намерен или нулев. Както можете да видите, процедурата включва получаване на списъка с дъщерни възли и циклично преминаване през тях, избиране на възли на елементи с посоченото име.

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;
}

Имайте предвид, че DOM API третира текстовото съдържание в даден елемент като отделен възел от тип TEXT_NODE . В допълнение, текстовото съдържание може да бъде разделено на множество съседни текстови възли. Така че следната специална обработка е необходима за извличане на текстовото съдържание в рамките на елемент.

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();
}

Въоръжени с тези удобни функции, нека сега разгледаме някои код за изброяване на малко информация от нашия примерен XML. Бихме искали да покажем подробна информация за всяка книга, каквато би била налична в каталог на книги.

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);
}

Писане на XML изход

Java предоставя API за XML Tranform за трансформиране на XML данни. Ние използваме този API с трансформация на идентичността за генериране на продукция.

Като пример, нека добавим нов Книга елемент към примерния каталог, представен по -горе. Подробностите за книгата (като напр автор , заглавие и т.н.) могат да бъдат получени външно, може би от файл със свойства или от база данни. Използваме следния файл със свойства за зареждане на данните.

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.

Първата стъпка е да анализирате съществуващия XML файл, като използвате метода, представен по -горе. Кодът също е показан по -долу.

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

Зареждаме данните от файла със свойства с помощта на Имоти клас, снабден с java. Кодът е доста прост и е показан по -долу.

String propsFile = ...;
Properties props = new Properties();
try (FileReader in = new FileReader(propsFile)) {
props.load(in);
}

След като свойствата се заредят, ние извличаме стойностите, които искаме да добавим от файла със свойства.

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');

Нека сега създадем празно Книга елемент.

как да инсталирате канала homebrew
Element book = document.createElement('book');
book.setAttribute('id', id);

Добавяне на дъщерни елементи към Книга е тривиално. За удобство събираме необходимите имена на елементи в a Списък и добавете стойностите в цикъл.

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);

И така се прави. The каталог елемент сега има новото Книга добавен елемент. Сега остава само да изпишете актуализирания XML.

За писане на XML се нуждаем от екземпляр на Трансформатор който е създаден, както е показано по -долу. Обърнете внимание, че искаме отстъпване на изходния XML с помощта на setOutputProperty () метод.

TransformerFactory tfact = TransformerFactory.newInstance();
Transformer tform = tfact.newTransformer();
tform.setOutputProperty(OutputKeys.INDENT, 'yes');
tform.setOutputProperty('{http://xml.apache.org/xslt}indent-amount', '3');

Последната стъпка в генерирането на XML изхода е прилагането на трансформацията. Резултатът се появява на изходния поток, System.out .

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

За да запишете изхода директно във файл, използвайте следното.

tform.transform(new DOMSource(document), new StreamResult(new File('output.xml')));

И това завършва тази статия за четене и писане на XML файлове с помощта на DOM API.

Използвали ли сте DOM API във вашите приложения? Как се представи? Моля, уведомете ни в коментарите по -долу.

Дял Дял Туит електронна поща Canon срещу Nikon: Коя марка фотоапарат е по -добра?

Canon и Nikon са двете най -големи имена в камерата. Но коя марка предлага по -добрата гама от фотоапарати и обективи?

Прочетете Напред
Свързани теми
  • Програмиране
  • Java
За автора Джей Шридхар(17 статии са публикувани) Още от Джей Шридхар

Абонирайте се за нашия бюлетин

Присъединете се към нашия бюлетин за технически съвети, рецензии, безплатни електронни книги и изключителни оферти!

Щракнете тук, за да се абонирате