XMLParser using DOM – [Read XML]


DOM Parser

Có lẻ ai củng biết khi nhắc đến xữ lý 1 XML chúng ta không ngần ngại nói tới DOM. Có lẻ đây là cách dể dàng nhất cho anh em lập trình java như tụi mình parser một file XML.

Nó parser file XML Document và load nó vào trong bộ nhớ vì vậy DOM parser chậm và tốn nhiều bộ nhớ.

Read Simple XML

Chúng ta có 1 file XML như sau :

	<?xml version="1.0"?>
	<company>
		<staff id="1001">
			<firstname>Kobee</firstname>
			<lastname>Bryan</lastname>
			<address>24/3 TN P.16 GV</address>
			<birthdate>10/10/1991</birthdate>
		</staff>
		<staff id="1002">
			<firstname>Jenny</firstname>
			<lastname>Nguyen</lastname>
			<address>123 QT P.11 GV</address>
			<birthdate>18/05/1992</birthdate>
		</staff>
		<staff id="1003">
			<firstname>Justina</firstname>
			<lastname>Tran</lastname>
			<address>Seul 222/222</address>
			<birthdate>01/01/1990</birthdate>
		</staff>
		<staff id="1004">
			<firstname>Bek</firstname>
			<lastname>Botun</lastname>
			<address>Seso LL GV</address>
			<birthdate>20/10/1994</birthdate>
		</staff>
	</company>

Chúng ta viết Chương trình parser file XML trên :

Chúng ta tạo ra Object class tương ứng với Element của root company trên có tên là Staff.java

package thaihoanghai.demo1;

import java.util.Date;

/**
 * @author kobee
 *
 */
public class Staff {
	private String id;
	private String firstname;
	private String lastName;
	private String address;
	private Date birthDate;

	public Staff(String id, String firstname, String lastName, String address,
			Date birthDate) {
		super();
		this.id = id;
		this.firstname = firstname;
		this.lastName = lastName;
		this.address = address;
		this.birthDate = birthDate;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getFirstname() {
		return firstname;
	}
	public void setFirstname(String firstname) {
		this.firstname = firstname;
	}
	public String getLastName() {
		return lastName;
	}
	public void setLastName(String lastName) {
		this.lastName = lastName;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public Date getBirthDate() {
		return birthDate;
	}
	public void setBirthDate(Date birthDate) {
		this.birthDate = birthDate;
	}

	@Override
	public String toString() {
		return "Staff [id=" + id + ", firstname=" + firstname + ", lastName="
				+ lastName + ", address=" + address + ", birthDate="
				+ birthDate + "]";
	}

}

Ok chúng ta có thể tạo Main và run chương trình :

package thaihoanghai.demo1;

import java.io.File;
import java.util.Date;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ReadXML_1 {
	public static void main(String[] args) {
		try {
			File xmlFile = new File("staff.xml");
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
			Document doc = dBuilder.parse(xmlFile);
			doc.getDocumentElement().normalize();
			System.out.println("Root element : " + doc.getDocumentElement().getNodeName());
			NodeList nList = doc.getElementsByTagName("staff");
			for(int i = 0; i < nList.getLength(); i++){
				Node nNode = nList.item(i);
				if(nNode.getNodeType() == Node.ELEMENT_NODE){
					Element eElement = (Element) nNode;
					String id = eElement.getAttribute("id");
					String firstName = eElement.getElementsByTagName("firstname").item(0).getTextContent();
					String lastName = eElement.getElementsByTagName("lastname").item(0).getTextContent();
					String address = eElement.getElementsByTagName("address").item(0).getTextContent();

					String strBirthDate = eElement.getElementsByTagName("birthdate").item(0).getTextContent();
					Date birthDate = new Date(strBirthDate);

					Staff s = new Staff(id, firstName, lastName, address, birthDate);
					System.out.println(s.toString());
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

Read Complex XML

Chúng ta có file XML như sau :

<?xml version="1.0"?>
<company>
	<staff id="1001">
		<fullname value="Thai Hoang Hai">
			<firstname>Thai</firstname>
			<midlename>Hoang</midlename>
			<lastname>Hai</lastname>
		</fullname>

		<address>24/3 TN P.16 GV</address>

		<birthdate value="10/10/1991">
			<day>10</day>
			<month>10</month>
			<year>1991</year>
		</birthdate>		
	</staff>
</company>

File XML của chúng ta dường như có nhiều subchild hơn vậy làm sao ta có thể kiểm tra được current element có tồn tại các child element hay không và trong các Current element có tồn tại thuộc tính nào hay không.

Chúng ta có thể loop qua dựa vào các điều kiện cụ thể .

package thaihoanghai.demo1;

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 ReadXML_2 {

	public static void main(String[] args) {
		try {
			File fileXML = new File("NewStaff.xml");
			DocumentBuilderFactory dbDactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder dBuilder = dbDactory.newDocumentBuilder();
			Document doc = dBuilder.parse(fileXML);

			System.out.println("Root element : " + doc.getDocumentElement().getNodeName());
			if(doc.hasChildNodes()){
				printNode(doc.getChildNodes());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void printNode(NodeList nodeList){
		for (int i = 0; i < nodeList.getLength(); i++) {
			Node tempNode = nodeList.item(i);
			// make sure it's element node
			if(tempNode.getNodeType() == Node.ELEMENT_NODE){
				// get node name and value
				System.out.println("Node Name = " + tempNode.getNodeName() + " [Open]");
				System.out.println("Node Value = " + tempNode.getTextContent().trim());

				if(tempNode.hasAttributes()){
					// get attributes names and values
					NamedNodeMap nodeMap = tempNode.getAttributes();
					for (int j = 0; j < nodeMap.getLength(); j++) {
						Node node = nodeMap.item(j);
						System.out.println("Attr Name  : " + node.getNodeName());
						System.out.println("Attr Value : " + node.getNodeValue());
					}
				}

				if(tempNode.hasChildNodes()){
					// loop again if has child nodes
					printNode(tempNode.getChildNodes());
				}
				System.out.println("Node Name = " + tempNode.getNodeName() + "[CLOSE]");
			}
		}
	}
}

Ok chúc các bạn thành công !!!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: