四种方法解析XML文档:Dom、SAX、JDOM、dom4j
1、了解XML:
XML,即可扩展标记语言(Extensible Markup Language),标准通用标记语言的子集,一种用于标记电子文件使其具有结构性的标记语言。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。它和JSON都是一种数据交换格式。
作用:解析XML文档,创建XML文档。
2、什么是可扩展标记语言?
· 可扩展标记语言是一种很像超文本标记语言的标记语言。
· 它的设计宗旨是传输数据,而不是显示数据。
· 它的标签没有被预定义。您需要自行定义标签。
· 它被设计为具有自我描述性。
· 它是W3C的推荐标准。
3、解析XML文档的四种方式: 四种方法解析XML文档:Dom、SAX、JDOM、dom4j
第一种: DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。
第一种:DOM的XML文件读取:
1.DocumentBuilderFactory.newInstance() 创建DocumentBuilderFactory的对象
2.DocumentBuilder 获得具体的DOM解析器。
3. Parse( new File() ) 获取文档xml路径。
—————看注释
准备XML文档:
- <?xml version="1.0" encoding="UTF-8"?>
- <Languages cat="it">
- <lan id="1">
- <name>Java</name>
- <ide>Eclipse</ide>
- </lan>
- <lan id="2">
- <name>Swift</name>
- <ide>Xcode</ide>
- </lan>
- <lan id="3">
- <name>C#</name>
- <ide>Visual Studio</ide>
- </lan>
- </Languages>
看看DOM解析的例子:
- package dom;
- import java.io.File;
- import java.io.IOException;
-
- import javax.xml.parsers.DocumentBuilder;
- import javax.xml.parsers.DocumentBuilderFactory;
- import javax.xml.parsers.ParserConfigurationException;
-
- import org.w3c.dom.Document;
- import org.w3c.dom.Element;
- import org.w3c.dom.Node;
- import org.w3c.dom.NodeList;
- import org.xml.sax.SAXException;
-
-
-
-
-
- public class ReaderXML {
- public static void main(String[] args) {
- try {
-
-
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-
- DocumentBuilder builder = factory.newDocumentBuilder();
-
-
- Document document = builder.parse(new File("languages.xml"));
-
-
- Element root = document.getDocumentElement();
- System.out.println("cat="+root.getAttribute("cat"));
-
- NodeList list = root.getElementsByTagName("lan");
-
- for (int i = 0; i < list.getLength(); i++) {
-
-
- System.out.println("---------------");
- Element lan = (Element) list.item(i);
- System.out.println("id=" + lan.getAttribute("id"));
-
-
- NodeList clist = lan.getChildNodes();
- for (int j = 0; j < clist.getLength(); j++) {
-
- Node c = clist.item(j);
-
- if (c instanceof Element) {
- System.out.println(c.getNodeName()+"="+c.getTextContent());
- }
- }
- }
-
- } catch (ParserConfigurationException e) {
- e.printStackTrace();
- } catch (SAXException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- }
第一种:DOM 的XML文件创建:
1.DocumentBuilderFactory.newInstance() 获取DOM 解析器的工厂实例。
2. DocumentBuilder 获得具体的DOM解析器。
3.创建一个xml文档,获得Document对象(根结点)(createElement)。
4. 创建根元素、根结点、setAttribute ("根结点名");
5. 添加根节点的值:setTextContent(“Value”);
6.子节点添加到根节点:appendChild(“根结点”);
7.输出:TransformerFactory !
- package dom;
-
- import java.io.File;
- import java.io.StringWriter;
-
- import javax.xml.parsers.DocumentBuilder;
- import javax.xml.parsers.DocumentBuilderFactory;
- import javax.xml.parsers.ParserConfigurationException;
- import javax.xml.transform.Transformer;
- import javax.xml.transform.TransformerException;
- 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;
-
-
-
-
-
-
-
- public class Creat_XML {
- public static void main(String [] ags){
-
- try {
-
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- DocumentBuilder builder = factory.newDocumentBuilder();
-
- Document document = builder.newDocument();
-
- Element root = document.createElement("Languages");
- root.setAttribute("cat", "it");
-
-
- Element lan = document.createElement("lan");
- lan.setAttribute("id", "1");
- Element name = document.createElement("name");
- name.setTextContent("java");
- Element ide = document.createElement("IDE");
- ide.setTextContent("Eclipse");
- lan.appendChild(name);
- lan.appendChild(ide);
- <span style="font-size:14px;"></span><pre name="code" class="java">
- Element lan2 = document.createElement("lan");
- lan2.setAttribute("id", "2");
- Element name2 = document.createElement("name");
- name2.setTextContent("Swift");
- Element ide2 = document.createElement("ide");
- ide2.setTextContent("XCode");
- lan2.appendChild(name2);
- lan2.appendChild(ide2);
-
-
- root.appendChild(lan);
- root.appendChild(lan2);
- document.appendChild(root);
-
-
- TransformerFactory transformerFactory = TransformerFactory.newInstance();
- Transformer transformer = transformerFactory.newTransformer();
- transformer.setOutputProperty("encoding", "UTF-8");
-
- StringWriter writer = new StringWriter();
- transformer.transform(new DOMSource(document), new StreamResult(writer));
- System.out.println(writer.toString());
-
- transformer.transform(new DOMSource(document), new StreamResult(new File("newxml.xml")));
-
-
-
-
-
- } catch (ParserConfigurationException | TransformerException e) {
- e.printStackTrace();
- }
- }
- }
第二种:dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的,dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。
下载:dom4j架包
第二种:Dom4j创建XML步骤:
1. 设置根节点: DocumentHelper.createElement("根节点名");
2. 读取doucment元素:DocumentHelper.createDocument(root);
3.添加根节点:addAttribute("name", "value");
4. 添加字节点、赋值:addElement("name"); setText("value");
5. 添加到根节点:XMLWriter xmlWriter = new XMLWriter(); xmlWriter.write(document);
- package dom4j;
-
- import java.io.FileOutputStream;
- import org.dom4j.Document;
- import org.dom4j.DocumentHelper;
- import org.dom4j.Element;
- import org.dom4j.io.OutputFormat;
- import org.dom4j.io.XMLWriter;
-
-
- public class Greate_dom4j {
- public static void main(String[] args) throws Exception
- {
-
- Element root = DocumentHelper.createElement("books");
- Document doucment = DocumentHelper.createDocument(root);
-
- root.addAttribute("name","bookvalue");
-
- Element element1 = root.addElement("author1 ");
- element1.addAttribute( "name", "James1" );
- element1.addAttribute( "location1", "UK1" );
- element1.addText( "James Strachan1" );
-
- Element element = root.addElement("author2 ");
- element.addAttribute( "name", "chen" );
- element.addAttribute( "kenken", "ZK" );
- element.addText( "chen kenken" );
-
- XMLWriter xmlwriter2 = new XMLWriter();
- xmlwriter2.write(doucment);
-
- OutputFormat format = new OutputFormat();
-
- FileOutputStream file = new FileOutputStream("books.xml");
- XMLWriter xml = new XMLWriter(file);
-
- xml.close();
- }
-
-
- }
第二种:Dom4j读取XML步骤:
1.获取SAM接口:SAXReader saxReader = new SAXReader();
2.获取XML文档: Document doc = saxReader.read(new File("name.xml"));
3.获取根节点:Element root = doc.getRootElement();
4.获取子节点:root.elementIterator();
5.获取孙节点: attributeIterator();
- package dom4j;
- import java.io.File;
- import java.util.Iterator;
- import java.util.List;
-
- import org.dom4j.Attribute;
- import org.dom4j.Document;
- import org.dom4j.Element;
- import org.dom4j.io.SAXReader;
-
-
-
-
-
-
-
- public class Rreader_dom4j{
- public static void main(String[] args) throws Exception{
-
-
- SAXReader saxReader = new SAXReader();
-
- Document doc = saxReader.read(new File("newxml.xml"));
-
- Element root = doc.getRootElement();
- System.out.println("根节点: " + root.getName());
-
- System.out.println("----------------");
-
-
- Iterator<?> it = root.elementIterator();
- while(it.hasNext()){
- Element elem = (Element) it.next();
-
- List<Attribute> li = elem.attributes();
- for (Attribute att : li ) {
- System.out.println(att.getName() + " " + att.getValue() );
- }
-
-
- Iterator<?> ite = elem.elementIterator();
- while(ite.hasNext()){
- Element child = (Element) ite.next();
- System.out.println(child.getName() + " " + child.getStringValue());
- }
-
- System.out.println("----------------");
- }
-
-
- }
- }
第三种:JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念等),把SAX和DOM的功能有效地结合起来。
JDOM是用Java语言读、写、操作XML的新API函数。在直接、简单和高效的前提下,这些API函数被最大限度的优化。
JDOM读取XML:
- package com.jdom;
-
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.UnsupportedEncodingException;
- import java.util.List;
- import org.jdom2.Attribute;
- import org.jdom2.Document;
- import org.jdom2.Element;
- import org.jdom2.JDOMException;
- import org.jdom2.input.SAXBuilder;
-
-
-
-
-
-
- public class ReaderJDom {
- public static void main(String[] args) {
-
- try {
-
-
- SAXBuilder saxBuilder = new SAXBuilder();
-
- InputStream in = new FileInputStream("Book.xml");
- InputStreamReader isr = new InputStreamReader(in, "UTF-8");
-
- Document document = saxBuilder.build(isr);
-
- Element rootElement = document.getRootElement();
-
- List<Element> elementList = rootElement.getChildren();
-
- for (Element element : elementList) {
-
- List<Attribute> list = element.getAttributes();
- for (Attribute attr : list) {
-
- String attrName = attr.getName();
-
- String attrValue = attr.getValue();
- System.out.println(attrName +"="+ attrValue);
-
-
- List<Element> listChild = element.getChildren();
- for (Element child : listChild) {
- System.out.println(child.getName() +"="+child.getValue());
- }
-
- }
- System.out.println("——————————————————————");
- }
-
-
- }catch (FileNotFoundException e) {
- e.printStackTrace();
- }catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }catch (JDOMException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
JDOM创建xml:
- package com.jdom;
-
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
-
- import org.jdom2.Document;
- import org.jdom2.Element;
- import org.jdom2.output.Format;
- import org.jdom2.output.XMLOutputter;
-
-
-
-
-
- public class CreateJDom {
- public static void main(String[] args) {
-
-
- Element rss = new Element("Languages");
-
- rss.setAttribute("Cat","it");
-
- Document document = new Document(rss);
-
-
- Element lan = new Element("lan");
- lan.setAttribute("id","1");
- Element name = new Element("name");
- name.setText("java");
- lan.addContent(name);
-
- Element IDE = new Element("IDE");
- IDE.setText("eclipse");
- lan.addContent(IDE);
- rss.addContent(lan);
-
-
- Element lan2 = new Element("lan");
- lan2.setAttribute("id","1");
- Element name2 = new Element("name");
- name2.setText("C#");
- lan.addContent(name2);
-
- Element IDE2 = new Element("IDE");
- IDE2.setText("Visual Studio");
- lan2.addContent(IDE2);
- rss.addContent(lan2);
-
-
-
- Format format = Format.getCompactFormat();
- format.setIndent("");
- format.setEncoding("GBK");
-
-
- XMLOutputter outputer = new XMLOutputter(format);
- try {
-
-
- outputer.output(document, new FileOutputStream(new File("Booknews.xml")));
-
-
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
第四种:SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。