XML与java的应用

对于XML进行解析,我们需要调用第三方提供的接口,对XML文档进行解析;

对于XML处理方面,W3C有两种解决方法:

(1)DOM(Document Object Model):

(2)SAX(Simple API for XML)


DOM介绍:


特点:先将xml文档解析成dom树,并放入内存,能够随机访问任意节点。

缺点:因为需要放入内存操作,所以对文件大小有限制。

DOM位于org.w3c.dom包中。


一、3个核心的接口:

接口所在包:

import  javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;

(1)Document:是整个文档的根结点。只有取得了Document结点,才能够对文档操作。


常用方法:

(1)Element elem = document.createElement("elem");     //创建一个结点

(2)Attribute attr = document.createAttribute("attr");       // 创建一个属性

(3)Text t = document.createTextNode("text");          //创建一个文本节点

(4)NodeList list = document.getElementsByTagName("...");   //寻找某个结点


(2)Node:DOM树是由结点组成,因此结点是很重要的。


常用方法:

(1)appendChild(Node child);      //添加子节点

(2)getFirstChild();                 //获得第一个子节点

(3)getNodeValue();           //得到节点的值

(4)hasChildNodes();         //是否还有子节点


(3)NodeList:是由Node组成的一个List。


常用方法:

(1)Node item(int x);              //获得第几个节点

(2)getLength();          // 获得list的长度

如果要获得Document对象,需要:

------------------------------------------------------------

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();

Document doc = builder.parse("....");获得doc

 ------------------------------------------------------------

生成xml文件方法:需要TransformerFactory,Transformer,StreamResult,DOMSource。

方法:

Document doc = builder.newDocument();

生成DOM树

StreamResult result = new StreamResult(new File("..."));

DOMSource source = new DOMSource(doc);

TransformerFactory factory  = TransformerFactory.newInstance();

Transformer t = factory.newTransformer();

t.transform(source,result);即可




<?xml version="1.0" encoding="GBK"?>
<persons>
	<person>
		<name>xiazdong</name>
		<age>20</age>
		<school>ecnu</school>
	</person>
	<person>
		<name>xzdong</name>
		<age>15</age>
		<school>nanyang</school>
	</person>
</persons>

读取文档信息:

import org.w3c.dom.*;
import javax.xml.parsers.*;
public class DOMDemo01{
	public static void main(String args[])throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document doc = builder.parse("demo.xml");
		NodeList plist = doc.getElementsByTagName("person");
		for(int i=0;i<plist.getLength();i++){
			Element elem = (Element)plist.item(i);
			System.out.println("姓名:"+elem.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());
			System.out.println("年龄:"+elem.getElementsByTagName("age").item(0).getFirstChild().getNodeValue());
			System.out.println("学校:"+elem.getElementsByTagName("school").item(0).getFirstChild().getNodeValue());
		}
	}
}

生成XML文档:

import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import java.io.*;
public class DOMDemo02{
	public static void main(String args[])throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document doc = builder.newDocument();
		Element person = doc.createElement("person");
		Element age = doc.createElement("age");
		Element name = doc.createElement("name");
		Text xiazdong = doc.createTextNode("xiazdong");
		Text ageText = doc.createTextNode("15");
		age.appendChild(ageText);
		name.appendChild(xiazdong);
		person.appendChild(name);
		person.appendChild(age);
		doc.appendChild(person);
		DOMSource source = new DOMSource(doc);
		TransformerFactory tf = TransformerFactory.newInstance();
		Transformer t = tf.newTransformer();
		StreamResult result = new StreamResult(new File("output.xml"));
		t.transform(source,result);
	}
}

生成后xml文档结构:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<person>
	<name>xiazdong</name>
	<age>15</age>
</person>


SAX介绍:


只能读取,不能生成或改变,并且只能遍历。

缺点:只能读取。

SAX的主要方法有5个:


(1)public void startDocument()throws SAXException;

(2)public void endDocument()throws SAXException;

(3)public void startElement(String uri,String localname,String name,Attribute attr)throws SAXException;

(4)public void endElement(String uri,String localname,String name)throws SAXException;

(5)public void characters(char[]ch , int start,int length)throws SAXException;


SAX属于触发类型的,当遇到文档开头就触发(1)方法,遇到元素的开头触发(3)方法;

因此如果我们需要使用SAX,必须要自己实现一个SAX解析器;

 注意:解析器必须继承DefaultHandler;

实现完解析器后,则可以做操作:


SAXParserFactory factory = SAXParserFactory.newInstance();

SAXParser parser = factory.newSAXParser();

parser.parse("文件路径",new MySAXParser());


即可;


XML解析工具:

(1)DOM4J

DOM4J是一个XML操作的包,为了提供给用户更简便的操作XML。

以下是生成一个XML文件的代码:

Document doc = DocumentHelper.createDocument();

Element name = doc.addElement("name");

Element first = name.addElement("firstname");

Element second = name.addElement("secondname");

first.setText("xia");

second.setText("second");

OutputFormat format = OutputFormat.createPrettyPrint();

format.setEncoding("gb2312");

XMLWriter writer = new XMLWriter(new FileOutputStream("out.xml"),format);

writer.write(doc);

writer.close();

以下是读取一个XML文件的代码:

SAXReader reader = new SAXReader();

Document doc = reader.read(new File("out.xml"));

Element root = doc.getRootElement();

Iterator iter  = root.elementIterator();

Element elem = (Element)iter.next();

String str = elem.elementText("first");

(2)JDOM:也是一个非常好的解析工具,但是性能上比DOM4J差了不少,所以不用。

Javascript中运用DOM:把html想象成一个DOM树。

这里通过id进行查找。

var elem = document.getElementById("id");

elem.innerHTML

生成一个<input type = "button" value = "button"/>过程:

var form = document.getElementById("form");            //获得表单节点

Element button = document.createElement("input");        //创建一个节点

button.setAttribute("type","button");        //设置属性

button.setAttribute("value","button");    //设置属性

form.appendChild(button);        //添加form的子节点

作者:xiazdong
出处:http://blog.xiazdong.info
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
原文地址:https://www.cnblogs.com/xiazdong/p/3058366.html