Java Dom对XML的解析和修改操作

   与Dom4J和JDom对XML的操作类似,JDK提供的JavaDom解析器用起来一样方便,在解析XML方面Java DOM甚至更甚前两者一筹!其不足之处在于对XML的增删改比较繁琐,特开篇介绍...

1、XML文件如下:

<?xml version="1.0"  encoding="UTF-8"?>
<address-book>
    <contact id="01" type="家庭" >
        <name>张三</name>
        <address>黄山路666号</address>
        <city>阜阳</city>
        <province>安徽</province>
        <postalcode>236000</postalcode>
        <country>中国</country>
        <telephone>18056075816</telephone>
</contact>
<contact id="02" type="商务" >
        <name>李四</name>
        <address>望江西路888号</address>
        <city>合肥</city>
        <province>安徽</province>
        <postalcode>230091</postalcode>
        <country>中国</country>
        <telephone>13956921922</telephone>
</contact>
<contact id="03" type="同学" >
        <name>王五</name>
        <address>民主路3号</address>
        <city>贵港市</city>
        <province>广西</province>
        <postalcode>537111</postalcode>
        <country>中国</country>
        <telephone>13965131384</telephone>
</contact>
<address-book>


2、与XML对应的域对象如下:

public class Contact
{
	private String id;
	private String type;
	private String name;
	private String address;
	private String city;
	private String privince;
	private String postalcode;
	private String country;
	private String telephone;
	
	public Contact(String id, String type, String name, String address,
			String city, String privince, String postalcode, String country,
			String telephone)
	{
		this.id = id;
		this.type = type;
		this.name = name;
		this.address = address;
		this.city = city;
		this.privince = privince;
		this.postalcode = postalcode;
		this.country = country;
		this.telephone = telephone;
	}
	
	
	public Contact()
	{
		
	}
	
	//省略Set Get方法
	
}


3、解析XML的过程

import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ParseXML
{
	List<Contact> contacts = new ArrayList<Contact>();

	public List<Contact> getContacts()
	{
		return contacts;
	}

	public ParseXML() throws Exception
	{
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		Document doc = db.parse("YellowBook.xml");

		XPathFactory xpf = XPathFactory.newInstance();
		XPath xPath = xpf.newXPath();
		NodeList nodes = (NodeList) xPath.evaluate("/address-book/contact", doc, XPathConstants.NODESET);
		for(int i=0;i<nodes.getLength();i++)
		{
			Node node=nodes.item(i);
			this.contacts.add(nodeToContact(node));
		}
	}
	
	public Contact nodeToContact(Node node) throws Exception
	{
		XPathFactory xpf = XPathFactory.newInstance();
		XPath xPath = xpf.newXPath();
		String id=(String) xPath.evaluate("@id", node,XPathConstants.STRING);
		String type=(String) xPath.evaluate("@type", node,XPathConstants.STRING);
		String name=(String) xPath.evaluate("name", node,XPathConstants.STRING);
		String address=(String) xPath.evaluate("address", node,XPathConstants.STRING);
		String city=(String) xPath.evaluate("city", node,XPathConstants.STRING);
		String province=(String) xPath.evaluate("province", node,XPathConstants.STRING);
		String postalcode=(String) xPath.evaluate("postalcode", node,XPathConstants.STRING);
		String country=(String) xPath.evaluate("country", node,XPathConstants.STRING);
		String telephone=(String) xPath.evaluate("telephone", node,XPathConstants.STRING);
		Contact c=new Contact(id, type, name, address, city, province, postalcode, country, telephone);
		return c;
	}
}


4、对XML操作以及序列化的过程

import java.io.FileOutputStream;
import java.util.Scanner;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class SerializeXML
{
	public void serializeXML(String id) throws Exception
	{
		Scanner sc=new Scanner(System.in);
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		Document doc = db.parse("YellowBook.xml");
		
		NodeList nodes=doc.getElementsByTagName("contact");
		for(int i=0;i<nodes.getLength();i++)
		{
			Element e=(Element) nodes.item(i);
			if(e.getAttribute("id").equals(id))
			{
				System.out.println("输入类型:");
				String type=sc.nextLine();
				e.setAttribute("type", type);
				
				NodeList childNodes=e.getChildNodes();
				for(int j=0;j<childNodes.getLength();j++)
				{
					Node childNode=(Node) childNodes.item(j);
					if(childNode.getNodeName().equals("name"))
					{
						System.out.println("输入姓名:");
						String name=sc.nextLine();
						childNode.setTextContent(name);
					}
				}
			}
		}
		
		TransformerFactory transformerFactory=TransformerFactory.newInstance();
		Transformer transformer=transformerFactory.newTransformer();
		DOMSource domSource=new DOMSource(doc);
		transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
		StreamResult result=new StreamResult(new FileOutputStream("YellowBook.xml"));
		transformer.transform(domSource, result);
	}
}


5、涉及业务逻辑的处理

import java.util.List;

public class ContactService
{
	public Contact findById(String id) throws Exception
	{
		ParseXML xml=new ParseXML();
		List<Contact> contacts=xml.getContacts();
		Contact con=new Contact();
		for(Contact c:contacts)
		{
			if(c.getId().equals(id))
			{
				con=c;
			}
		}
		return con;
	}
	
	public void updateById(String id) throws Exception
	{
		SerializeXML serializeXML=new SerializeXML();
		serializeXML.serializeXML(id);
	}
}


6、测试

public class Main
{
	public static void main(String[] args) throws Exception
	{
		ContactService contactDao=new ContactService();
		Contact con=contactDao.findById("01");
		System.out.println(con.getName());
		
		contactDao.updateById("02");
	}
}




 

posted @ 2014-08-21 16:18  xmc0551  阅读(498)  评论(0编辑  收藏  举报