====== Lectura i escriptura d'arxius XML a Java ====== {{tag> #FpInfor #Dam #DamMp06 #DamMp06Uf1 #DamMp06Uf01}} ---- ==== Arxius XML en Java ==== En Java, els arxius XML poden tenir un tractament especial, per tal de poder accedir directament a les dades que contenen a través del seu arbre. Els exemples d'aquest document fan referència a un XML tipus: Maria Longstorm 18 1B John Bluefield 17 1B Emmie Fastbelt 35 1A Ernald Softson 23 1B Per llegir arxius XML fem servir "DocumentBuilderFactory", per obtenir el "Document" amb les dades, per exemple: try { DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(file); doc.getDocumentElement().normalize(); NodeList listStudents = doc.getElementsByTagName("student"); System.out.println("Número d'estudiants: " + listStudents.getLength()); }} catch(Exception e) { e.printStackTrace(); } Hi ha diferents maneres d'accedir a la informació dels Elements XML, una d'elles és amb "**.getElementsByTagName**", que ens retorna la llista d'elements amb aquest nom d'element (a l'exemple "student") El valor dels atributs d’un element es pot llegir amb “.**getAttribute**” En aquest exemple es veu com es poden llegir els atributs i continguts dels elements d'un arxiu XML: for(int cnt = 0; cnt < listStudents.getLength(); cnt = cnt + 1) { Node nodeEstudiant = listStudents.item(cnt); if(nodeEstudiant.getNodeType() == nodeEstudiant.ELEMENT_NODE) { Element elm = (Element) nodeEstudiant; String txt = ""; txt = txt + "> Student " + elm.getAttribute("id"); txt = txt + ", Name: " + elm.getElementsByTagName("name").item(0).getTextContent(); System.out.println(txt); } Cal fixar-se que també es poden agafar elements a partir de la seva posició amb "**.item**", i si els elements tenen contingut de text, aquest es pot obtenir amb "**.getTextContent**" També cal tenir en compte que es comprova que els elements siguin de tipus "ELEMENT_NODE" i no de text, per tal de poder fer el "**cast**" cap a "Element" Així ja es poden llegir els atributs o els altres elements que tingui dins ... == XPath == Per poder accedir més fàcilment als elements de l'arbre XML, es pot fer servir XPath Amb XPath es defineix el filtre dels elements que es volen obtenir en forma d'expressió, i desrprés s'avalua aquesta expressió per obtenir la llista en qüestió. Document doc = dBuilder.parse(file); XPath xPath = XPathFactory.newInstance().newXPath(); String expression = "/root/students/student[@id='id_e01']"; NodeList listExpression = (NodeList) xPath.compile(expression).evaluate(doc, XPathConstants.NODESET); Element elm = (Element) listExpression.item(0); String txt = ""; txt = txt + "> Student " + elm.getAttribute("id"); txt = txt + ", Name: " + elm.getElementsByTagName("name").item(0).getTextContent(); System.out.println(txt); En l'exemple anterior es busquen tots els estudiants que tinguin l'atribut "id" amb valor "id_e01" == Generar un arbre XML amb elements i atributs == Per generar un arbre XML i definir quins elements té, o bé quins atributs tenen aquests elements hi ha les funcions: - .**createElement**, crea un node de tipus element - .**createTextNode**, crea un node de tipus text - .**appendChild**, afegeix un element fill a un altre element - **setAttributeNode**, afegeix un atribut (i el seu valor) a un element Aquest exemple mostra com es pot generar un arbre XML amb elements i atributs: DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.newDocument(); Element elmRoot = doc.createElement("note"); doc.appendChild(elmRoot); Element elmTo = doc.createElement("to"); elmTo.appendChild(doc.createTextNode("John")); elmRoot.appendChild(elmTo); Attr attrId = doc.createAttribute("id"); attrId.setValue("1"); elmTo.setAttributeNode(attrId); Finalment, per escriure un arbre XML com l'anterior en un arxiu: // Save a Document into an XML file static public void write (String path, Document doc) { try { TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); trimWhitespace(doc); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(new File(path)); transformer.transform(source, result); } catch (TransformerException e) { e.printStackTrace(); } } ==== Exemples ==== {{ ::java-lecturaescripturaxml.zip |}} {{ ::java-lecturaescriptura.zip |}}