Реклама

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

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

Стандартно издание на Java (SE) 10 основни концепции на Java, които трябва да научите, когато започнетеНезависимо дали пишете GUI, разработвате софтуер от страна на сървъра или мобилно приложение с Android, изучаването на Java ще ви послужи добре. Ето някои основни концепции на Java, които да ви помогнат да започнете. Прочетете още включва Java API за XML обработка (JAXP), което е общ термин, обхващащ повечето аспекти на XML обработката. Те включват:

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

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

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

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

 1.0?>Гамбардела, МатюРъководство за XML разработчик
Компютър44.952000-10-01Задълбочен поглед върху създаването на приложения с XML.Ралс, Ким... 

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

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

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

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware (false); factory.setValidating (false); Builder на документите = factory.newDocumentBuilder(); 

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

Файлов файл =...; // XML файл за четене. Документ документ = builder.parse (файл); Каталог на елементи = document.getDocumentElement(); 

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

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

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

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

NodeList books = catalog.getChildNodes(); for (int i = 0, ii = 0, n = books.getLength(); i < n; i++) { Node child = books.item (i); if ( child.getNodeType() != Възел. ELEMENT_NODE ) продължава; Елементна книга = (Елемент) дете; // работи с книгата Element тук. }

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

статичен частен възел findFirstNamedElement (родител на възел, низ tagName) { NodeList children = parent.getChildNodes(); for (int i = 0, in = children.getLength(); i < в; i++) { Node child = children.item (i); if ( child.getNodeType() != Възел. ELEMENT_NODE ) продължава; if ( child.getNodeName().equals (tagName) ) връща дете; } връщане на нула; }

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

статичен частен низ getCharacterData (родител на възел) { StringBuilder text = new StringBuilder(); if ( parent == null ) върне text.toString(); NodeList деца = parent.getChildNodes(); for (int k = 0, kn = children.getLength(); k < kn; k++) { Node child = children.item (k); if ( child.getNodeType() != Възел. TEXT_NODE ) прекъсване; text.append (child.getNodeValue()); } връщане text.toString(); }

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

NodeList books = catalog.getChildNodes(); for (int i = 0, ii = 0, n = books.getLength(); i < n; i++) { Node child = books.item (i); if ( child.getNodeType() != Възел. ELEMENT_NODE ) продължава; Елементна книга = (Елемент) дете; ii++; Идентификатор на низ = 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")); Низ pubdate = getCharacterData (findFirstNamedElement (child,"pubdate")); String descr = getCharacterData (findFirstNamedElement (дете, "описание")); System.out.printf("%3d. идентификатор на книга = %s\n" + " автор: %s\n" + " заглавие: %s\n" + " жанр: %s\n" + " цена: %s\n" + " дата на публикуване: %s \n" + " descr: %s\n", ii, идентификатор, автор, заглавие, жанр, цена, публикуване, descr); }

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

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

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

id=bk113. автор=Джейн Остин. title=Гордост и предразсъдъци. жанр=Романс. цена=6,99. publish_date=2010-04-01. description="Общопризната истина е, че един мъж, който притежава добро състояние, трябва да има липса на жена." Така започва гордостта и Предразсъдъците, остроумната комедия на маниерите на Джейн Остин – един от най-популярните романи на всички времена – която представя великолепно цивилизовани сблъсъци между гордият г-н Дарси и предубедената Елизабет Бенет, докато играят оживено ухажване в поредица от гостна от осемнадесети век интриги. 

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

Файлов файл =...; // XML файл за четене. Документ документ = builder.parse (файл); Каталог на елементи = document.getDocumentElement(); 

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

String propsFile =...; Properties props = new Properties(); опитайте (FileReader in = new FileReader (propsFile)) { props.load (in); }

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

Идентификатор на низ = props.getProperty("id"); String author = props.getProperty("author"); String title = props.getProperty("title"); String genre = props.getProperty("genre"); String price = props.getProperty("price"); Низ publish_date = props.getProperty("publish_date"); String descr = props.getProperty("описание"); 

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

Елементна книга = document.createElement("книга"); book.setAttribute("id", id); 

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

Списъкelnames =Arrays.asList("author", "title", "genre", "price", "publish_date", "description"); for (String elname: elnames) { Element el = document.createElement (elname); Текстов текст = document.createTextNode (props.getProperty (elname)); el.appendChild (текст); book.appendChild (el); } catalog.appendChild (книга);

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

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

TransformerFactory tfact = TransformerFactory.newInstance(); Трансформатор tform = tfact.newTransformer(); tform.setOutputProperty (OutputKeys. ОТСТЪП, "да"); tform.setOutputProperty("{ http://xml.apache.org/xslt}indent-amount", "3"); 

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

tform.transform (нов DOMSource (документ), нов StreamResult (System.out)); 

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

tform.transform (нов DOMSource (документ), нов StreamResult (нов файл("output.xml"))); 

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

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