نحوه خواندن فایل 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 را نشان می دهد.