oruji.github.io
oruji.github.ioPersian Tutorials
ویرایش: 1396/11/14 17:00
A A

نحوه خواندن فایل XML در جاوا - (DOM Parser)

در این آموزش از کتاب برخط جاوا، نحوه خواندن فایل XML با استفاده از DOM XML Parser را نشان خواهیم داد. DOM Parser فایل و سند XML را خوانده و آن را در حافظه بارگذاری می کند؛ سپس آن را جهت دستکاری و پایش به صورت یک ساختار درختی در می آورد.

به صورت مختصر، یک فایل XML به DOM یا ساختار درختی تبدیل می شود، و شما باید نُد (Node) به نُد برای بدست آوردن آنچه می خواهید در آن پیمایش کنید.

Node چیست؟

در DOM، همه چیز در یک سند XML یک نُد است.

اخطار

DOM Parser زمانیکه یک فایل XML با داده های زیاد را بارگذاری می کند، کند یا آهسته است و حافظه زیادی را مصرف می کند.

1. مثال DOM XML Parser

مثال زیر نحوه بدست آوردن یک نُد از طریق نام آن را نشان داده و مقدار آن را نمایش می دهد:

<?xml version="1.0"?> <company> <staff id="1001"> <firstname>amin</firstname> <lastname>Kourosh</lastname> <nickname>oruji</nickname> <salary>100000</salary> </staff> <staff id="2001"> <firstname>Kaveh</firstname> <lastname>Ahangar</lastname> <nickname>Siavash</nickname> <salary>200000</salary> </staff> </company>package org.amoozesh; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; import java.io.File; public class ReadXMLFile { public static void main(String argv[]) { try { File fXmlFile = new File("/Users/oruji/staff.xml"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(fXmlFile); //optional, but recommended //read this - http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work doc.getDocumentElement().normalize(); System.out.println("Root element :" doc.getDocumentElement().getNodeName()); NodeList nList = doc.getElementsByTagName("staff"); System.out.println("----------------------------"); for (int temp = 0; temp < nList.getLength(); temp ) { Node nNode = nList.item(temp); System.out.println("\nCurrent Element :" nNode.getNodeName()); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; System.out.println("Staff id : " eElement.getAttribute("id")); System.out.println("First Name : " eElement.getElementsByTagName("firstname").item(0).getTextContent()); System.out.println("Last Name : " eElement.getElementsByTagName("lastname").item(0).getTextContent()); System.out.println("Nick Name : " eElement.getElementsByTagName("nickname").item(0).getTextContent()); System.out.println("Salary : " eElement.getElementsByTagName("salary").item(0).getTextContent()); } } } catch (Exception e) { e.printStackTrace(); } } }

خروجی:

Root element :company ---------------------------- Current Element :staff Staff id : 1001 First Name : amin Last Name : kourosh Nick Name : oruji Salary : 100000 Current Element :staff Staff id : 2001 First Name : kaveh Last Name : ahangar Nick Name : siavash Salary : 200000

2. حلقه در نُدها

مثال زیر همان فایل XML قبلی را می خواند، و نحوه حلقه درون ندهای آن را نشان می دهد، و همچنین نام نُد و مقدار آن به همراه attribute آن در صورت وجود را نشان می دهد:

package org.amoozesh; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class ReadXMLFile2 { public static void main(String[] args) { try { File file = new File("/Users/oruji/staff.xml"); DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); Document doc = dBuilder.parse(file); System.out.println("Root element :" doc.getDocumentElement().getNodeName()); if (doc.hasChildNodes()) { printNote(doc.getChildNodes()); } } catch (Exception e) { System.out.println(e.getMessage()); } } private static void printNote(NodeList nodeList) { for (int count = 0; count < nodeList.getLength(); count ) { Node tempNode = nodeList.item(count); // make sure it's element node. if (tempNode.getNodeType() == Node.ELEMENT_NODE) { // get node name and value System.out.println("\nNode Name =" tempNode.getNodeName() " [OPEN]"); System.out.println("Node Value =" tempNode.getTextContent()); if (tempNode.hasAttributes()) { // get attributes names and values NamedNodeMap nodeMap = tempNode.getAttributes(); for (int i = 0; i < nodeMap.getLength(); i ) { Node node = nodeMap.item(i); System.out.println("attr name : " node.getNodeName()); System.out.println("attr value : " node.getNodeValue()); } } if (tempNode.hasChildNodes()) { // loop again if has child nodes printNote(tempNode.getChildNodes()); } System.out.println("Node Name =" tempNode.getNodeName() " [CLOSE]"); } } } }

خروجی:

Root element :company Node Name =company [OPEN] Node Value = amin kourosh oruji 100000 kaveh ahangar siavash 200000 Node Name =staff [OPEN] Node Value = amin kourosh oruji 100000 attr name : id attr value : 1001 Node Name =firstname [OPEN] Node Value =yong Node Name =firstname [CLOSE] Node Name =lastname [OPEN] Node Value =mook kim Node Name =lastname [CLOSE] Node Name =nickname [OPEN] Node Value =oruji Node Name =nickname [CLOSE] Node Name =salary [OPEN] Node Value =100000 Node Name =salary [CLOSE] Node Name =staff [CLOSE] Node Name =staff [OPEN] Node Value = kaveh ahangar siavash 200000 attr name : id attr value : 2001 Node Name =firstname [OPEN] Node Value =kaveh Node Name =firstname [CLOSE] Node Name =lastname [OPEN] Node Value =ahangar Node Name =lastname [CLOSE] Node Name =nickname [OPEN] Node Value =siavash Node Name =nickname [CLOSE] Node Name =salary [OPEN] Node Value =200000 Node Name =salary [CLOSE] Node Name =staff [CLOSE] Node Name =company [CLOSE]

نکته

شما ممکن است علاقه مند به خواندن آموزش نحوه بدست آوردن رنکینگ Alexa در جاوا باشید، این آموزش نحوه استفاده از DOM برای parse کردن نتیجه XML فایل Alexa را نشان می دهد.

منابع

  1. When to Use DOM