对于XML进行解析,我们需要调用第三方提供的接口,对XML文档进行解析;
对于XML处理方面,W3C有两种解决方法:
(1)DOM(Document Object Model):
(2)SAX(Simple API for XML)
DOM介绍:
特点:先将xml文档解析成dom树,并放入内存,能够随机访问任意节点。
缺点:因为需要放入内存操作,所以对文件大小有限制。
DOM位于org.w3c.dom包中。
一、3个核心的接口:
(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的子节点 |