[size=medium][b]1. DOM(Document Object Model) [/b][/size]


此 方法主要由W3C提供,它将xml文件全部读入内存中,然后将各个元素组成一棵数据树,以便快速的访问各个节点 。 因此非常消耗系统性能 ,对比较大的文档不适宜采用DOM方法来解析。 DOM API 直接沿袭了 XML 规范。每个结点都可以扩展的基于 Node 的接口,就多态性的观点来讲,它是优秀的,但是在 Java 语言中的应用不方便,并且可读性不强。
实例:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<students> 
<student> 
  <name>TigerLee</name> 
  <age>26</age> 
  <sex>man</sex> 
  <address>北京朝阳区</address> 
  </student> 
 <student> 
  <name>snow</name> 
  <age>21</age> 
  <sex>girl</sex> 
  <address>上海</address> 
  </student> 
</students>


package JavaXml;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
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.Node;
import org.w3c.dom.NodeList;

/**
 * 采用DOM方式 在XML文档中实现增、删、改、查
 * 
 */
public class DOMForXml
{

	/**
	 * 获得doc对象
	 * @param fileName
	 * @return
	 */
	public Document getDocument(String fileName)
	{
		Document document = null;
		try
		{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			document = builder.parse(new File(fileName));

		} catch (Exception e)
		{
			e.printStackTrace();
		}

		return document;
	}

	/**
	 * 解析
	 * @param fileName
	 */
	public void paseXml(String strFileName)
	{
		Document document = getDocument(strFileName);
		NodeList nodeList = document.getElementsByTagName("student");
		for (int i = 0; i < nodeList.getLength(); i++)
		{
			StringBuilder sb = new StringBuilder();
			sb.append("姓名:"
					+ document.getElementsByTagName("name").item(i)
							.getFirstChild().getNodeValue());
			sb.append(" , ");
			sb.append("年龄:"
					+ document.getElementsByTagName("age").item(i)
							.getFirstChild().getNodeValue());
			sb.append(" , ");
			sb.append("性别:"
					+ document.getElementsByTagName("sex").item(i)
							.getFirstChild().getNodeValue());
			sb.append(" , ");
			sb.append("地址:"
					+ document.getElementsByTagName("address").item(i)
							.getFirstChild().getNodeValue());

			System.out.println(sb.toString());
		}
	}

	/**
	 * 将改动持久到文件
	 * @param doc
	 * @param distFileName
	 */
	public void modifyFile(Document doc, String distFileName)
	{
		try
		{
			TransformerFactory tf = TransformerFactory.newInstance();
			Transformer tfer = tf.newTransformer();
			DOMSource dsource = new DOMSource(doc);
			StreamResult sr = new StreamResult(new File(distFileName));
			tfer.transform(dsource, sr);

			paseXml("student.xml");
		} catch (Exception e)
		{
			e.printStackTrace();
		}

	}

	/**
	 * 创建一个新的学生
	 * 
	 * @param name
	 * @param age
	 * @param sex
	 * @param address
	 */
	public void addNewNode(String name, String age, String sex, String address)
	{
		try
		{
			Document document = getDocument("student.xml");
			NodeList nodeList = document.getElementsByTagName("students");
			// 创建新的节点
			Node studentNode = document.createElement("student");
			Node nameNode = document.createElement("name");
			nameNode.appendChild(document.createTextNode(name));
			Node ageNode = document.createElement("age");
			ageNode.appendChild(document.createTextNode(age));
			Node sexNode = document.createElement("sex");
			sexNode.appendChild(document.createTextNode(sex));
			Node addressNode = document.createElement("address");
			addressNode.appendChild(document.createTextNode(address));
			// 添加节点
			studentNode.appendChild(nameNode);
			studentNode.appendChild(ageNode);
			studentNode.appendChild(sexNode);
			studentNode.appendChild(addressNode);
			nodeList.item(0).appendChild(studentNode);

			//modifyFile(document, "student.xml");

			// 此时真正的处理将新数据添加到文件中(磁盘)
			TransformerFactory tf = TransformerFactory.newInstance();
			Transformer tfer = tf.newTransformer();
			DOMSource dsource = new DOMSource(document);
			StreamResult sr = new StreamResult(new File("student_1.xml"));
			tfer.transform(dsource, sr);
		} catch (Exception e)
		{
			e.printStackTrace();
		}

		paseXml("student.xml");
	}

	/**
	 * 删除一个节点
	 * 
	 * @param name
	 */
	public void deleteNode(String name)
	{
		Document document = getDocument("student.xml");

		NodeList nodeList = document.getElementsByTagName("name");
		for (int i = 0; i < nodeList.getLength(); i++)
		{
			String value = nodeList.item(i).getFirstChild().getTextContent();
			if (name != null && name.equalsIgnoreCase(value))
			{
				Node parentNode = nodeList.item(i).getParentNode();
				document.getFirstChild().removeChild(parentNode);
			}
		}
		modifyFile(document, "student.xml");
	}

	/**
	 * 根据name修改某个节点的内容
	 * 
	 * @param name
	 */
	public void updateNode(String name)
	{

		Document document = getDocument("student.xml");
		NodeList nodeList = document.getElementsByTagName("name");
		for (int i = 0; i < nodeList.getLength(); i++)
		{
			String value = nodeList.item(i).getFirstChild().getTextContent();
			if (name != null && name.equalsIgnoreCase(value))
			{
				Node parentNode = nodeList.item(i).getParentNode();
				NodeList nl = parentNode.getChildNodes();
				for (int j = 0; j < nl.getLength(); j++)
				{
					String modifyNode = nl.item(j).getNodeName();
					if (modifyNode.equalsIgnoreCase("age"))
					{
						nl.item(j).getFirstChild().setTextContent("25");
					}
				}
			}
		}
		modifyFile(document, "student.xml");
	}

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		DOMForXml domForXml = new DOMForXml();

		//读取文本内容
		//domForXml.paseXml("student.xml");
		System.out.println("==============================");

		domForXml.addNewNode("test", "22", "child", "shenzhen");

		//domForXml.updateNode("snow");

		//domForXml.deleteNode("Snow");
	}
}


[size=medium][b]2. dom4j[/b][/size]

据悉dom4j在xml解析方面是性能最好的,hibernate等框架都使用它作为解析的工具。

要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/

目前最新dom4j包下载地址:http://nchc.dl.sourceforge.net/sourceforge/dom4j/dom4j-1.6.1.zip

解开后有两个包,仅操作XML文档的话把dom4j-1.6.1.jar加入工程就可以了,如果需要使用XPath的话还需要加入包jaxen-1.1-beta-7.jar

写了简单的dom4j的使用的demo,以备回忆,有些是dom4j的文挡里例子改编的

使用dom4j解析下面的xml文件。

读xml内容


package JavaXml;

import java.io.File;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.ProcessingInstruction;
import org.dom4j.VisitorSupport;
import org.dom4j.io.SAXReader;

public class Dom4JForXmlReader {

	public static void main(String[] args) 
	{
		SAXReader reader = new SAXReader();
		File file = new File("student.xml");
		try {
			Document doc = reader.read(file);
			doc.accept(new MyVistor());
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	static class MyVistor extends VisitorSupport 
	{
		public void visit(Attribute node) 
		{
			System.out.println("Attibute:---" + node.getName() + "="
					+ node.getValue());
		}

		public void visit(Element node) 
		{
			if (node.isTextOnly()) 
			{
				//此处读取具体内容
				System.out.println("Element:---" + node.getName() + "="
						+ node.getText());
			}
			else 
			{
				System.out.println("--------" + node.getName() + "-------");
			}
		}

		@Override
		public void visit(ProcessingInstruction node) 
		{
			System.out.println("PI:" + node.getTarget() + " " + node.getText());
		}
	}
}

写xml内容


package JavaXml;

import java.io.FileWriter;
import java.io.IOException;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class Dom4JForXmlWriter {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try 
		{
			XMLWriter writer = new XMLWriter(new FileWriter("author.xml"));
			Document doc = createDoc();
			writer.write(doc);
			writer.close();

			// Pretty print the document to System.out
			// 设置了打印的格式,将读出到控制台的格式进行美化
			OutputFormat format = OutputFormat.createPrettyPrint();
			writer = new XMLWriter(System.out, format);
			writer.write(doc);

		} 
		catch (IOException e) 
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static Document createDoc() 
	{
		Document doc = DocumentHelper.createDocument();
		Element root = doc.addElement("root");
		Element author1 = root.addElement("author")
				.addAttribute("name", "Kree").addAttribute("location", "UK")
				.addText("Kree Strachan");
		Element author2 = root.addElement("author")
				.addAttribute("name", "King").addAttribute("location", "US")
				.addText("King McWrirter");
		return doc;
	}
}


<?xml version="1.0" encoding="UTF-8"?>
<root>
<author name="Kree" location="UK">Kree Strachan</author>
<author name="King" location="US">King McWrirter</author>
</root>

[b][size=medium]3、使用Jdom读取xml[/size][/b]


读取xml内容:


<?xml version="1.0" encoding="GBK"?> 
<学校> 
   <学生> 
      <姓名>孟星魂</姓名> 
      <年龄>18</年龄> 
      <性别>男</性别>   
   </学生> 
  <学生> 
      <姓名>冷燕</姓名> 
      <年龄>17</年龄> 
      <性别>女</性别>    
    </学生> 
 </学校>




package JavaXml;

/** 
 * Java读取xml文件,必须要加载jdom.jar程序。 
 * 您必须有jdom-1.1插件,如果没有,可以在网上搜索下载。 
 * 加载的jdom.jar位于jdom-1.1/build/jdom.jar 
 * 这里我准备了一段xml代码,它在这个文档的最底部。 
 * 您要使用这个xml代码时,不要忘记去掉注释符号。^_^ 
 */
import java.io.File;
import java.io.FileInputStream;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

public class JdomForXmlReader 
{

	public static void main(String[] args) 
	{
		FileInputStream fileInputStr = null;
		try 
		{

			fileInputStr = new FileInputStream(new File("jdomStudent.xml"));
			SAXBuilder sb = new SAXBuilder();
			Document doc = sb.build(fileInputStr);
			Element root = doc.getRootElement(); // 得到根元素
			List<?> Allstudents = root.getChildren(); // 得到根元素所有子元素的集合
			Element student = null;

			StringBuilder sbuilder = null;
			for (int i = 0; i < Allstudents.size(); i++) 
			{
				sbuilder = new StringBuilder(200);
				student = (Element) Allstudents.get(i);
				// 下面代码根据节点名称获得xml文件节点内的信息并输出。
				sbuilder.append(student.getChild("姓名").getText()).append(", ");
				sbuilder.append(student.getChild("年龄").getText()).append(", ");
				sbuilder.append(student.getChild("性别").getText()).append(", ");
				System.out.println(sbuilder.toString());
			}

		} 
		catch (Exception e) 
		{
			e.printStackTrace();
		} 
		finally
		{
			try 
			{
				fileInputStr.close();
			} 
			catch (Exception e) 
			{
				e.printStackTrace();
			}
		}
	}
}

附使用的架包