Kaip skaityti ir rašyti XML failus naudojant kodą

Kaip skaityti ir rašyti XML failus naudojant kodą

Ar norėtumėte išmokti skaityti ir rašyti XML failą iš java?





XML failai naudojami įvairiems tikslams, įskaitant duomenų saugojimą. Prieš išpopuliarėjant JSON, XML buvo pageidaujamas formatas struktūriniams duomenims atvaizduoti, saugoti ir perkelti. Nors pastaraisiais metais XML populiarumas sumažėjo, retkarčiais galite su juo susidurti, todėl svarbu išmokti su juo dirbti naudojant kodą.





„Java Standard Edition“ (SE) apima „Java“ API, skirta XML apdorojimui (JAXP) , kuris yra bendras terminas, apimantis daugumą XML apdorojimo aspektų. Jie apima:





  • SPRENDIMAS: Dokumento objekto modelis apima klases, skirtas dirbti su XML artefaktais, tokiais kaip elementas, mazgas, atributai ir tt. DOM API įkelia visą XML dokumentą į atmintį apdorojimui, todėl jis nėra labai tinkamas darbui su dideliais XML failais.
  • SAX: Paprasta XML API yra įvykiu pagrįstas algoritmas XML skaitymui. Čia XML apdorojamas suaktyvinant įvykius, rastus skaitant XML. Šio metodo naudojimo atminties reikalavimai yra nedideli, tačiau darbas su API yra sudėtingesnis nei darbas su DOM.
  • STAX: Srautinio perdavimo API, skirta XML, yra naujausias XML API papildymas ir suteikia didelio našumo srauto filtravimą, apdorojimą ir XML modifikavimą. Nors išvengiama viso XML dokumento įkėlimo į atmintį, ji suteikia traukimo tipo architektūrą, o ne įvykius pagrįstą architektūrą, todėl programą lengviau koduoti ir suprasti nei naudojant SAX API.

Šiame straipsnyje mes naudojame DOM API parodyti, kaip skaityti ir rašyti XML failus iš java. Būsimuose straipsniuose aptarsime kitas dvi API.

Pavyzdinis XML failas

Šiame straipsnyje mes parodome sąvokas naudodami šį XML pavyzdį, kurį galima rasti čia :






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


Ralls, Kim
...

XML failo skaitymas

Pažvelkime į pagrindinius veiksmus, kurių reikia norint skaityti XML failą naudojant DOM API.

Pirmasis žingsnis yra gauti egzempliorių DocumentBuilder . Kūrėjas naudojamas analizuoti XML dokumentus. Pagrindiniam naudojimui mes tai darome taip:





kaip įdėti horizontalią liniją į žodį
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

Dabar galime įkelti visą dokumentą į atmintį, pradedant nuo XML šakninio elemento. Mūsų pavyzdyje tai yra katalogas elementas.

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

Ir viskas, žmonės! DOM API XML skaitymui yra tikrai paprasta. Dabar turite prieigą prie viso XML dokumento, pradedant nuo jo šakninio elemento, katalogas . Dabar pažiūrėkime, kaip su juo dirbti.





Naudojant DOM API

Dabar, kai turime XML šaknį Elementas , mes galime naudoti DOM API, kad išgautume įdomias informacijos dalis.

Gaukite visus knyga šaknies elemento vaikai ir kilpa per juos. Prisimink tai getChildNodes () grįžta visi vaikams, įskaitant tekstą, komentarus ir tt Mūsų tikslui mums reikia tik vaikiškų elementų, todėl praleidžiame kitus.

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
}

Kaip rasti konkretų vaiko elementą, atsižvelgiant į tėvą? Šis statinis metodas grąžina pirmąjį atitikimo elementą, jei jis yra, arba nulį. Kaip matote, procedūra apima antrinių mazgų sąrašo gavimą ir ciklo per juos parinkimą elemento mazgų su nurodytu pavadinimu.

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

Atminkite, kad DOM API elemento tekstinį turinį laiko atskiro tipo mazgu TEXT_NODE . Be to, teksto turinys gali būti padalintas į kelis gretimus teksto mazgus. Taigi, norint gauti elemento teksto turinį, reikalingas toks specialus apdorojimas.

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

Apsiginklavę šiomis patogumo funkcijomis, dabar pažvelkime į tam tikrą kodą, kaip išvardyti tam tikrą informaciją iš pavyzdinio XML. Norėtume parodyti išsamią informaciją apie kiekvieną knygą, tokią, kokia būtų prieinama knygų kataloge.

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

Rašymas XML išvestis

„Java“ teikia XML „Tranform“ API transformuoti XML duomenis. Mes naudojame šią API su tapatybės transformacija produkcijai generuoti.

Kaip pavyzdį pridėkime naują knyga elementą į aukščiau pateiktą pavyzdinį katalogą. Knygos detalės (pvz autorius , titulas ir tt) galima gauti iš išorės, galbūt iš ypatybių failo arba duomenų bazės. Norėdami įkelti duomenis, naudojame šį ypatybių failą.

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.

Pirmasis žingsnis yra išanalizuoti esamą XML failą naudojant aukščiau pateiktą metodą. Kodas taip pat parodytas žemiau.

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

Įkeliame duomenis iš ypatybių failo naudodami Savybės klasė aprūpinta java. Kodas yra gana paprastas ir parodytas žemiau.

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

Įkėlę ypatybes, iš savybių failo nuskaitome vertes, kurias norime pridėti.

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

Dabar sukurkime tuščią knyga elementas.

nešiojamasis kietasis diskas nerodomas
Element book = document.createElement('book');
book.setAttribute('id', id);

Antrinių elementų pridėjimas prie knyga yra trivialus. Patogumui renkame reikiamus elementų pavadinimus a Sąrašas ir pridėkite reikšmes į kilpą.

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

Ir taip yra daroma. The katalogas elementas dabar turi naują knyga elementas pridėtas. Dabar lieka tik išrašyti atnaujintą XML.

Norėdami rašyti XML, mums reikia egzemplioriaus Transformatorius kuris sukurtas, kaip parodyta žemiau. Atminkite, kad prašome išvesties XML įtraukos naudojant setOutputProperty () metodas.

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

Paskutinis XML išvesties generavimo žingsnis yra transformacijos taikymas. Rezultatas rodomas išvesties sraute, System.out .

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

Norėdami įrašyti išvestį tiesiai į failą, naudokite šiuos nurodymus.

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

Tai baigia šį straipsnį apie XML failų skaitymą ir rašymą naudojant DOM API.

Ar naudojate DOM API savo programose? Kaip tai pasirodė? Praneškite mums toliau pateiktose pastabose.

Dalintis Dalintis „Tweet“ Paštu „Canon“ prieš „Nikon“: kuris fotoaparato prekės ženklas yra geresnis?

„Canon“ ir „Nikon“ yra du didžiausi pavadinimai fotoaparatų pramonėje. Tačiau kuris prekės ženklas siūlo geresnę fotoaparatų ir objektyvų seriją?

Skaityti toliau
Susijusios temos
  • Programavimas
  • „Java“
Apie autorių Jay Sridhar(Paskelbti 17 straipsnių) Daugiau iš Jay Sridhar

Prenumeruokite mūsų naujienlaiškį

Prisijunkite prie mūsų naujienlaiškio, kad gautumėte techninių patarimų, apžvalgų, nemokamų el. Knygų ir išskirtinių pasiūlymų!

Norėdami užsiprenumeruoti, spustelėkite čia