四种方法解析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接口的机制也被称作随机访问机制。
4.1、开始动手
第一种:DOM的XML文件读取:——看注释
1.DocumentBuilderFactory.newInstance() 创建DocumentBuilderFactory的对象
2.DocumentBuilder 获得具体的DOM解析器。
3. Parse( new File() ) 获取文档xml路径。
4.1.1准备XML文档:这里我用的是languages.xml
- <span style="background-color: rgb(255, 255, 255);"><?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></span>
4.1.2看看DOM解析的例子
- <span style="background-color: rgb(255, 255, 255);">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;
- /*
- * DOM Class Reader
- *
- */
- public class ReaderXML {
- public static void main(String[] args) {
- try {
- //1。获取DOM 解析器的工厂实例。
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- //2。获得具体的DOM解析器。
- DocumentBuilder builder = factory.newDocumentBuilder();
- //3。获取文件
- Document document = builder.parse(new File("languages.xml"));
- //4。获取根元素
- Element root = document.getDocumentElement();
- System.out.println("cat="+root.getAttribute("cat"));
- //5。获取根节点[有多个节点]
- NodeList list = root.getElementsByTagName("lan");
- for (int i = 0; i < list.getLength(); i++) {
- //Node lan = list.item(i);
- //System.out.println("id="+lan.getNodeType());
- 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();
- }
- }
- }
- </span>
4.2第一种:DOM 的XML文件创建
1.DocumentBuilderFactory.newInstance() 获取DOM 解析器的工厂实例。
2. DocumentBuilder 获得具体的DOM解析器。
3.创建一个xml文档,获得Document对象(根结点)(createElement)。
4. 创建根元素、根结点、setAttribute ("根结点名");
5. 添加根节点的值:setTextContent(“Value”);
6.子节点添加到根节点:appendChild(“根结点”);
7.输出:TransformerFactory !
- <span style="background-color: rgb(255, 255, 255);">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;
- /*
- * DOM Class Great
- *
- */
- 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();
- }
- }
- }
- </span>
第二种: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);
- <span style="background-color: rgb(255, 255, 255);">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();
- }
- } </span>
第二种: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();
- <span style="background-color: rgb(255, 255, 255);">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;
- /*
- * dom4j Class Reader
- *
- */
- public class Rreader_dom4j{
- public static void main(String[] args) throws Exception{
- //1.获取SAM接口:
- SAXReader saxReader = new SAXReader();
- //2.获取XML文件:
- Document doc = saxReader.read(new File("newxml.xml"));
- //3.获取根节点:
- 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("----------------");
- }
- }
- }
- </span>
第三种:JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念等),把SAX和DOM的功能有效地结合起来。
JDOM是用Java语言读、写、操作XML的新API函数。在直接、简单和高效的前提下,这些API函数被最大限度的优化。
3.1、JDOM读取XML:
- <span style="background-color: rgb(255, 255, 255);">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;
- /**
- * JDOM Class Reader
- *
- */
- public class ReaderJDom {
- public static void main(String[] args) {
- try {
- //1.创建一个SAXBuilder的对象
- SAXBuilder saxBuilder = new SAXBuilder();
- //2.创建一个输入流,将xml文件加载到输入流中
- InputStream in = new FileInputStream("Book.xml");
- InputStreamReader isr = new InputStreamReader(in, "UTF-8");
- //3.通过saxBuilder的build方法,将输入流加载到saxBuilder中
- Document document = saxBuilder.build(isr);
- //4.通过document对象获取xml文件的根节点
- Element rootElement = document.getRootElement();
- //5.获取根节点下的子节点的List集合
- 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);
- // 对book节点的子节点的节点名以及节点值的遍历
- 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();
- }
- }
- }
- </span>
3.2、JDOM创建xml:
- <span style="background-color: rgb(255, 255, 255);">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;
- /**
- * Create Class
- *
- */
- public class CreateJDom {
- public static void main(String[] args) {
- //1.生成一个根节点
- Element rss = new Element("Languages");
- //2.为节点添加属性
- rss.setAttribute("Cat","it");
- //3.生成一个document对象
- 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");
- //4.创建XMLOutputter的对象
- XMLOutputter outputer = new XMLOutputter(format);
- try {
- //5.利用outputer将document对象转换成xml文档
- outputer.output(document, new FileOutputStream(new File("Booknews.xml")));
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- </span>
第四种:SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。