reklama
Chcete se naučit číst a zapisovat XML soubor z javy?
XML soubory Co je soubor XML a jak jej můžete otevřít a používat?Možná jste viděli výraz „XML“. Možná jste dokonce omylem otevřeli soubor XML. Co je XML a jak jej používáte? Přečtěte si více se používají pro různé účely včetně ukládání dat. Než se JSON stal populárním, byl XML preferovaným formátem pro reprezentaci, ukládání a přenos strukturovaných dat. I když obliba XML v posledních letech upadá, občas se s ním můžete setkat, takže je důležité naučit se s ním pracovat z kódu.
Java Standard Edition (SE) 10 základních pojmů Java, které byste se měli naučit, když začínáteAť už píšete GUI, vyvíjíte software na straně serveru nebo mobilní aplikaci využívající Android, učení Java vám dobře poslouží. Zde jsou některé základní koncepty Java, které vám pomohou začít. Přečtěte si více zahrnuje Java API pro zpracování XML (JAXP), což je zastřešující termín pokrývající většinu aspektů zpracování XML. Tyto zahrnují:
- DOM: Objektový model dokumentu obsahuje třídy pro práci s artefakty XML, jako jsou element, uzel, atributy atd. DOM API načte kompletní XML dokument do paměti ke zpracování, takže se pro práci s velkými XML soubory příliš nehodí.
- SAXOFON: Simple API for XML je událostmi řízený algoritmus pro čtení XML. Zde je XML zpracováno spouštěním událostí nalezených při čtení XML. Požadavky na paměť pro použití této metody jsou nízké, ale práce s API je složitější než práce s DOM.
- StAX: Streaming API for XML je nedávným přírůstkem do XML API a poskytuje vysoce výkonné filtrování toku, zpracování a modifikaci XML. I když se vyhýbá načítání celého dokumentu XML do paměti, poskytuje spíše architekturu typu pull než architektura řízená událostmi, takže aplikace je snadněji kódovatelná a pochopitelná než použití SAX API.
V tomto článku používáme DOM API ukázat, jak číst a zapisovat soubory XML z jazyka Java. Dalšími dvěma API se budeme zabývat v budoucích článcích.
Ukázkový soubor XML
Pro účely tohoto článku demonstrujeme koncepty pomocí následujícího vzorového XML, který lze nalézt tady:
1.0?>Gambardella, Matthew XML Developer's Guide
Počítač 44.95 2000-10-01 Podrobný pohled na vytváření aplikací s XML. Rally, Kim ...
Čtení souboru XML
Podívejme se na základní kroky potřebné pro čtení souboru XML pomocí DOM API.
Prvním krokem je získat instanci DocumentBuilder. Tvůrce se používá k analýze dokumentů XML. Pro základní použití to děláme takto:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware (false); factory.setValidating (false); Tvůrce DocumentBuilder = factory.newDocumentBuilder();
Nyní můžeme načíst celý dokument do paměti počínaje kořenovým prvkem XML. V našem příkladu je to katalog živel.
Soubor soubor =...; // XML soubor ke čtení. Dokument dokumentu = builder.parse (soubor); Katalog prvků = document.getDocumentElement();
A je to, lidi! DOM API pro čtení XML je opravdu jednoduché. Nyní máte přístup k celému dokumentu XML počínaje jeho kořenovým prvkem, katalog. Pojďme se nyní podívat, jak s tím pracovat.
Pomocí DOM API
Nyní, když máme kořen XML Živel, můžeme použít DOM API k extrahování zajímavých nugetů informací.
Získejte všechny rezervovat potomci kořenového prvku a smyčka přes ně. Všimněte si, že getChildNodes() se vrací Všechno děti, včetně textu, komentářů atd. Pro náš účel potřebujeme pouze dětské prvky, takže ostatní přeskočíme.
NodeList books = Catalog.getChildNodes(); for (int i = 0, ii = 0, n = knihy.getLength(); i < n; i++) { Node child = books.item (i); if ( child.getNodeType() != Uzel. ELEMENT_NODE ) pokračovat; Element kniha = (Element) dítě; // zde pracujte s knihou Element. }
Jak najdete konkrétní podřízený prvek vzhledem k nadřazenému? Následující statická metoda vrátí první odpovídající prvek, pokud je nalezen, nebo null. Jak můžete vidět, postup zahrnuje získání seznamu podřízených uzlů a jejich procházení a vybírání uzlů prvků se zadaným názvem.
statický soukromý uzel findFirstNamedElement (rodič uzlu, řetězec tagName) { NodeList children = parent.getChildNodes(); for (int i = 0, in = děti.getLength(); i < in; i++) { Node child = children.item (i); if ( child.getNodeType() != Uzel. ELEMENT_NODE ) pokračovat; if ( child.getNodeName().equals (tagName) ) return child; } return null; }
Všimněte si, že DOM API považuje textový obsah v prvku za samostatný uzel typu TEXT_NODE. Kromě toho může být textový obsah rozdělen do několika sousedních textových uzlů. K načtení textového obsahu v prvku je tedy vyžadováno následující speciální zpracování.
statický soukromý řetězec getCharacterData (rodič uzlu) { StringBuilder text = new StringBuilder(); if ( parent == null ) return text.toString(); NodeList children = parent.getChildNodes(); for (int k = 0, kn = děti.getLength(); k < kn; k++) { Node child = children.item (k); if ( child.getNodeType() != Uzel. TEXT_NODE ) break; text.append (child.getNodeValue()); } return text.toString(); }
Vyzbrojeni těmito pohodlnými funkcemi se nyní podíváme na nějaký kód pro výpis některých informací z našeho vzorového XML. Ke každé knize bychom rádi zobrazili podrobné informace, jaké by byly k dispozici v katalogu knih.
NodeList books = Catalog.getChildNodes(); for (int i = 0, ii = 0, n = knihy.getLength(); i < n; i++) { Node child = books.item (i); if ( child.getNodeType() != Uzel. ELEMENT_NODE ) pokračovat; Element kniha = (Element) dítě; ii++; String id = book.getAttribute("id"); String author = getCharacterData (findFirstNamedElement (child,"author")); String title = getCharacterData (findFirstNamedElement (child,"title")); Řetězec žánr = getCharacterData (findFirstNamedElement (child,"genre")); String price = getCharacterData (findFirstNamedElement (child,"price")); String pubdate = getCharacterData (findFirstNamedElement (child,"pubdate")); String descr = getCharacterData (findFirstNamedElement (child,"popis")); System.out.printf("%3d. id knihy = %s\n" + " autor: %s\n" + " název: %s\n" + " žánr: %s\n" + " cena: %s\n" + " datum vydání: %s \n" + " popis: %s\n", ii, id, autor, název, žánr, cena, datum zveřejnění, popis); }
Zápis XML výstupu
Java poskytuje XML Transform API transformovat data XML. Toto API používáme s transformace identity generovat výstup.
Jako příklad přidáme nový rezervovat prvek do vzorového katalogu uvedeného výše. Podrobnosti o knize (např autor, titulatd.) lze získat externě, například ze souboru vlastností nebo databáze. K načtení dat používáme následující soubor vlastností.
id=bk113. autorka=Jane Austenová. titul = Pýcha a předsudek. žánr = romantika. cena = 6,99. datum_vydání=2010-04-01. description="Je všeobecně uznávanou pravdou, že svobodný muž, který má velké jmění, musí mít nedostatek manželky." Tak začíná Pride a Předsudek, vtipná komedie chování Jane Austenové – jeden z nejoblíbenějších románů všech dob –, který představuje skvěle civilizované sparringy mezi hrdý pan Darcy a zaujatá Elizabeth Bennet, když hrají své temperamentní námluvy v sérii salonů z 18. století intriky.
Prvním krokem je analyzovat existující soubor XML pomocí výše uvedené metody. Kód je také uveden níže.
Soubor soubor =...; // XML soubor ke čtení. Dokument dokumentu = builder.parse (soubor); Katalog prvků = document.getDocumentElement();
Data načteme ze souboru vlastností pomocí Vlastnosti třída vybavená javou. Kód je poměrně jednoduchý a je zobrazen níže.
String propsFile =...; Vlastnosti props = new Properties(); try (FileReader in = new FileReader (propsFile)) { props.load (in); }
Jakmile jsou vlastnosti načteny, získáme hodnoty, které chceme přidat, ze souboru vlastností.
String id = props.getProperty("id"); String author = props.getProperty("author"); String title = props.getProperty("title"); Řetězec žánr = props.getProperty("genre"); String price = props.getProperty("price"); Řetězec publish_date = props.getProperty("publish_date"); String descr = props.getProperty("popis");
Nyní vytvoříme prázdnotu rezervovat živel.
Element kniha = document.createElement("kniha"); book.setAttribute("id", id);
Přidání podřízených prvků do rezervovat je triviální. Pro usnadnění shromažďujeme požadované názvy prvků v a Seznam a přidejte hodnoty ve smyčce.
Seznamelnames =Arrays.asList("autor", "název", "žánr", "cena", "datum_vydání", "popis"); for (String elname: elnames) { Element el = document.createElement (elname); Text textu = document.createTextNode (props.getProperty (elname)); el.appendChild (text); book.appendChild (el); } katalog.appendDítě (kniha);
A tak se to dělá. The katalog prvek má nyní nový rezervovat prvek přidán. Nyní zbývá pouze zapsat aktualizované XML.
Pro zápis XML potřebujeme instanci Transformátor který je vytvořen, jak je znázorněno níže. Všimněte si, že požadujeme odsazení výstupního XML pomocí setOutputProperty() metoda.
TransformerFactory tfact = TransformerFactory.newInstance(); Transformátor tform = tfact.newTransformer(); tform.setOutputProperty (OutputKeys. INDENT, "ano"); tform.setOutputProperty("{ http://xml.apache.org/xslt}indent-amount", "3");
Posledním krokem při generování výstupu XML je použití transformace. Výsledek se objeví ve výstupním proudu, System.out.
tform.transform (nový DOMSource (dokument), nový StreamResult (System.out));
Chcete-li zapsat výstup přímo do souboru, použijte následující.
tform.transform (nový DOMSource (dokument), nový StreamResult (nový File("output.xml")));
A to uzavírá tento článek o čtení a zápisu souborů XML pomocí DOM API.
Použili jste DOM API ve svých aplikacích? Jak to fungovalo? Dejte nám prosím vědět v komentářích níže.