对于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的子节点 |