Како читати и писати КСМЛ датотеке помоћу кода

Како читати и писати КСМЛ датотеке помоћу кода

Желите ли научити како читати и писати КСМЛ датотеку из јаве?





КСМЛ датотеке се користе у разне сврхе, укључујући складиштење података. Пре него што је ЈСОН постао популаран, КСМЛ је био преферирани формат за представљање, складиштење и транспорт структурираних података. Иако је популарност КСМЛ -а опадала последњих година, повремено ћете га наићи, па је важно да научите како да радите са њим из кода.





Јава Стандард Едитион (СЕ) укључује Јава АПИ за КСМЛ обраду (ЈАКСП) , који је кровни израз који покрива већину аспеката КСМЛ обраде. Ови укључују:





  • ПРЕСУДА: Објектни модел документа укључује класе за рад са КСМЛ артефактима као што су елементи, чвор, атрибути итд. ДОМ АПИ учитава комплетан КСМЛ документ у меморију за обраду, тако да није баш погодан за рад са великим КСМЛ датотекама.
  • САКС: Симпле АПИ фор КСМЛ је алгоритам за читање КСМЛ-а који се заснива на догађајима. Овде се КСМЛ обрађује покретањем догађаја пронађених приликом читања КСМЛ -а. Меморијски захтеви за коришћење ове методе су ниски, али рад са АПИ -јем је сложенији од рада са ДОМ -ом.
  • СТАКС: Стреаминг АПИ за КСМЛ је недавни додатак КСМЛ АПИ-има и пружа филтрирање, обраду и модификацију КСМЛ-а за пренос података високих перформанси. Иако избегава учитавање целог КСМЛ документа у меморију, он обезбеђује архитектуру повлачења уместо архитектуре засновану на догађајима, па је апликацију лакше кодирати и разумети него коришћењем САКС АПИ-ја.

У овом чланку користимо ДОМ АПИ показати како читати и писати КСМЛ датотеке из Јава -е. Друга два АПИ -ја ћемо обрадити у будућим чланцима.

Пример КСМЛ датотеке

За потребе овог чланка, демонстрирали смо концепте користећи следећи пример КСМЛ -а, који се може пронаћи овде :






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


Ralls, Kim
...

Читање КСМЛ датотеке

Погледајмо основне кораке потребне за читање КСМЛ датотеке помоћу ДОМ АПИ -ја.

Први корак је да добијете инстанцу ДоцументБуилдер . Алат за изградњу се користи за рашчлањивање КСМЛ докумената. За основну употребу, то радимо овако:





треба да оставите лаптоп стално укључен
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

Сада можемо учитати цео документ у меморију почевши од основног елемента КСМЛ. У нашем примеру, то је каталог елемент.

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

И то је то, људи! ДОМ АПИ за читање КСМЛ -а је заиста једноставан. Сада имате приступ целом КСМЛ документу почевши од његовог основног елемента, каталог . Хајде сада да видимо како да радимо са тим.





Коришћење ДОМ АПИ -ја

Сада када имамо КСМЛ роот Елемент , можемо користити ДОМ АПИ за издвајање занимљивих грумена информација.

Набавите све књига деца елемента корена и петља преко њих. Напоменути да гетЦхилдНодес () враћа све деца, укључујући текст, коментаре итд. За нашу сврху потребни су нам само елементи детета, па прескачемо остале.

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

Имајте на уму да ДОМ АПИ третира текстуални садржај унутар елемента као посебан чвор типа ТЕКСТ_НОДЕ . Осим тога, текстуални садржај може бити подељен на више суседних текстуалних чворова. Дакле, следећа посебна обрада је потребна за дохват текстуалног садржаја унутар елемента.

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

Наоружани овим функцијама погодности, погледајмо сада неки код за исписивање неких информација из нашег узорка КСМЛ -а. Желели бисмо да прикажемо детаљне информације о свакој књизи, као што би биле доступне у каталогу књига.

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

Писање КСМЛ излаза

Јава пружа КСМЛ Транформ АПИ за трансформацију КСМЛ података. Овај АПИ користимо са трансформација идентитета за генерисање излаза.

Као пример, додајмо нову књига елемент горе наведеног каталога узорака. Детаљи о књизи (нпр аутор , наслов итд.) могу се добити споља, можда из датотеке својстава или базе података. За учитавање података користимо следећу датотеку својстава.

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.

Први корак је рашчланити постојећу КСМЛ датотеку помоћу горе приказане методе. Код је такође приказан испод.

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

Учитавамо податке из датотеке својстава помоћу Некретнине класа снабдевена јавом. Код је прилично једноставан и приказан је испод.

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

Хајде сада да направимо празно књига елемент.

где могу да одем да одштампам нешто
Element book = document.createElement('book');
book.setAttribute('id', id);

Додавање подређених елемената у књига је тривијално. Ради практичности, прикупљамо потребна имена елемената у Листа и додајте вредности у петљу.

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

И тако се то ради. Тхе каталог елемент сада има ново књига елемент је додат. Сада остаје само да испишете ажурирани КСМЛ.

За писање КСМЛ -а потребна нам је инстанца Трансформатор који је креиран као што је приказано испод. Имајте на уму да захтевамо увлачење излазног КСМЛ -а помоћу сетОутпутПроперти () метода.

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

Последњи корак у генерисању КСМЛ излаза је примена транформације. Резултат се појављује на излазном току, Систем.оут .

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

Да бисте испис записали директно у датотеку, користите следеће.

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

Ово завршава овај чланак о читању и писању КСМЛ датотека помоћу ДОМ АПИ -ја.

Да ли сте користили ДОМ АПИ у својим апликацијама? Како се показао? Молимо вас да нас обавестите у коментарима испод.

Објави Објави Твеет Емаил Цанон против Никона: Која марка фотоапарата је боља?

Цанон и Никон су два највећа имена у индустрији фотоапарата. Али који бренд нуди бољу линију камера и објектива?

Прочитајте следеће
Повезане теме
  • Програмирање
  • Јава
О аутору Јаи Сридхар(17 објављених чланака) Више од Јаиа Сридхара

Претплатите се на наш билтен

Придружите се нашем билтену за техничке савете, критике, бесплатне е -књиге и ексклузивне понуде!

Кликните овде да бисте се претплатили