zoukankan      html  css  js  c++  java
  • Java 解析 xml 常见的4中方式:DOM SAX JDOM DOM4J

    Java 四种解析 XML 的特点

    1、DOM 解析:
    形成了树结构,有助于更好的理解、掌握,且代码容易编写。
    解析过程中,树结构保存在内存中,方便修改。

    2、SAX 解析:
    采用事件驱动模式,对内存耗费比较小。
    适用于只处理 XML 文件中的数据时

    3、JDOM 解析:
    仅使用具体类,而不使用接口。
    API 大量使用了 Collections 类。

    4、DOM4J 解析:
    JDOM 的一种智能分支,它合并了许多超出基本 XML 文档 表示的功能。
    它使用接口和抽象基本类方法。 具有性能优异、灵活性好、功能强大和极端易用的特点。
    是一个开放源码的文件

    代码:
    先准备一个book.xml文件放到src目录下:

    <?xml version="1.0" encoding="UTF-8"?>
    <books>
    	<book id="1001">
    		<name>三国演义</name>
    		<author>罗贯中</author>
    		<price>98.5</price>
    	</book>
    	<book id="1002">
    		<name>水浒传</name>
    		<author>施耐庵</author>
    		<price>89.7</price>
    	</book>
    	<book id="1003">
    		<name>西游记</name>
    		<author>吴承恩</author>
    		<price>99.9</price>
    	</book>
    	<book id="1004">
    		<name>红楼梦</name>
    		<author>曹雪芹</author>
    		<price>77.7</price>
    	</book>
    </books>
    

    1、DOM 解析:

    package com.xzlf.xml;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.NamedNodeMap;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    
    /**
     * DOM 解析 XML
     * @author xzlf
     *
     */
    public class DOMParseTest {
    	public static void main(String[] args) throws Exception {
    		// 1、创建 DocumentBuilderFactory 工厂对象
    		DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
    		// 2、通过工厂对象创建 DocumentBuilder 对象
    		DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
    		// 3、通过 DocumentBuilder 的 parse (...) 方法得到Document对象
    		Document doc = docBuilder.parse("src/book.xml");
    		
    		// 4、获取节点列表
    		NodeList bookList = doc.getElementsByTagName("book");
    		System.out.println(bookList.getLength());
    		// 遍历节点属性
    		for (int i = 0; i < bookList.getLength(); i++) {
    			// 获取每个节点的属性和值
    			Node item = bookList.item(i);
    			// 获取属性集合
    			NamedNodeMap attributes = item.getAttributes();
    			// 遍历属性集合
    			for (int j = 0; j < attributes.getLength(); j++) {
    				Node id = attributes.item(j);
    				System.out.println(id.getNodeName() + "--" + id.getNodeValue());
    			}
    		}
    		// 遍历子节点
    		System.out.println("====================");
    		for (int i = 0; i < bookList.getLength(); i++) {
    			Node item = bookList.item(i);
    			NodeList childNodes = item.getChildNodes();
    			for (int j = 0; j < childNodes.getLength(); j++) {
    				Node child = childNodes.item(j);
    				if(child.getNodeType() == Node.ELEMENT_NODE) {
    					System.out.println(child.getNodeName() + "--" + child.getTextContent());
    				}
    				
    			}
    			
    		}
    	}
    }
    
    

    运行:
    在这里插入图片描述
    2、SAX 解析:

    package com.xzlf.xml;
    
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    /**
     *  Sax 解析 xml
     * @author xzlf
     *
     */
    public class SAXParseTest {
    	public static void main(String[] args) throws Exception {
    		// 1、创建 SAXParserFactory 的对象 
    		SAXParserFactory saxFactory = SAXParserFactory.newInstance();
    		// 2、创建 SAXParser 对象 (解析器) 
    		SAXParser parser = saxFactory.newSAXParser();
    		// 3、创建一个 DefaultHandler 的子类 
    		BookHandler handler = new BookHandler();
    		// 4、调用 parse 方法 
    		parser.parse("src/book.xml", handler);
    	}
    }
    
    class BookHandler extends DefaultHandler{
    	/*开始解析 xml 文档时调用*/
    	@Override
    	public void startDocument() throws SAXException {
    		System.out.println("BookHandler.startDocument()");
    	}
    	
    	/*解析 xml 文档结束时调用*/
    	@Override
    	public void endDocument() throws SAXException {
    		System.out.println("==========解析文档结束==========");
    	}
    	
    	/*开始解析文档中节点时调用*/
    	@Override
    	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    		System.out.print("开始解析元素-->" + qName );
    		if("book".equals(qName)) {
    			System.out.println(attributes.getLength());
    			for (int i = 0; i < attributes.getLength(); i++) {
    				String attName = attributes.getQName(i);//属性名称
    				String attValue = attributes.getValue(i);//属性值
    				System.out.println("属性名称:" + attName + "属性值:" + attValue);
    			}
    		}
    	}
    	
    	/*解析文档中节点结束时调用*/
    	@Override
    	public void endElement(String uri, String localName, String qName) throws SAXException {
    		System.out.println("解析元素-->" + qName + "结束" );
    	}
    	
    	
    	@Override
    	public void characters(char[] ch, int start, int length) throws SAXException {
    		String values = new String(ch, start, length);
    		if(!"".equals(values.trim()))
    		System.out.println(values);
    	}
    }
    
    

    运行:
    在这里插入图片描述
    3、JDOM 解析:

    package com.xzlf.xml;
    
    import java.io.File;
    import java.util.List;
    
    import org.jdom.Attribute;
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.input.SAXBuilder;
    
    /**
     * JDOM 解析 xml
     * 需要导包:http://www.jdom.org/downloads/index.html
     * @author xzlf
     *
     */
    public class JDOMParseTest {
    	public static void main(String[] args) throws Exception{
    		// 1、创建一个 SAXBuilder 对象 
    		SAXBuilder sb = new SAXBuilder();
    		// 2、调用 build 方法,得到 Document 对象(通过 IO 流)
    		Document doc = sb.build(new File("src/book.xml"));
    		// 3、获取根节点 
    		Element rootEle = doc.getRootElement();//books
    		// 4、获取根节点的直接子节点的集合 
    		List<Element> children = rootEle.getChildren();
    		// 5、遍历集合 
    		for (int i = 0; i < children.size(); i++) {
    			Element ele =  children.get(i);
    			// 得到属性集合
    			List<Attribute> attributes = ele.getAttributes();
    			// 遍历属性的集合得到每一个属性
    			for (Attribute attr : attributes) {
    				System.out.println(attr.getName() + "-->" + attr.getValue());
    			}
    		}
    		// 获取每一个子节点
    		System.out.println("===========子节点==============");
    		for (int i = 0; i < children.size(); i++) {
    			Element book = children.get(i);
    			List<Element> ele = book.getChildren();
    			for (Element e : ele) {
    				System.out.print(e.getName() + "-->" + e.getValue() + "	");
    			}
    			System.out.println();
    		}
    		
    	}
    }
    
    

    运行:
    在这里插入图片描述
    4、DOM4J 解析:

    package com.xzlf.xml;
    
    import java.io.File;
    import java.util.Iterator;
    
    import org.dom4j.Attribute;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    /**
     * DOM4J 解析 XML
     * 需要导包:https://dom4j.github.io/#looping
     * @author xzlf
     *
     */
    public class DOM4JParseTest {
    	public static void main(String[] args) throws DocumentException {
    		// 1、创建 SAXReader 对象 
    		SAXReader reader = new SAXReader();
    		// 2、调用 read 方法 
    		Document doc = reader.read(new File("src/book.xml"));
    		// 3、获取根元素 
    		Element root = doc.getRootElement();//books
    		// 4、通过迭代器遍历直接节点 
    		for(Iterator<Element> iterator = root.elementIterator(); iterator.hasNext();) {
    			Element book = iterator.next();
    			System.out.println(book.getName());
    			//得到book的属性
    			for (Iterator<Attribute> iter = book.attributeIterator(); iter.hasNext();) {
    				Attribute attr = iter.next();
    				System.out.println("	" + attr.getName() + "-->" + attr.getValue());
    			}
    		}
    		// 遍历每一个 book 元素
    		for (Iterator<Element> iterator = root.elementIterator(); iterator.hasNext();) {
    			Element book = iterator.next();
    			//得到每一个子元素
    			for (Iterator<Element> iter = book.elementIterator(); iter.hasNext();) {
    				Element ele = iter.next();
    				System.out.println(ele.getName() + "-->" + ele.getText());
    			}
    		}
    		 
    	}
    }
    
    

    运行:
    在这里插入图片描述

    重视基础,才能走的更远。
  • 相关阅读:
    Linux共享wifi给Android手机
    史上最简单的Hibernate入门简单介绍
    TRIZ系列-创新原理-29-气动或液压结构原理
    使用GDI+进行图片处理时要注意的问题
    触发器系列(2) DataTrigger
    FizzBuzzWhizz问题python解法
    实现二值图像连通区标记之区域生长法
    《Java并发编程实战》第四章 对象的组合 读书笔记
    XCL-Charts画曲线图(CurveChart) 例2
    oracle中imp命令具体解释
  • 原文地址:https://www.cnblogs.com/xzlf/p/12681515.html
Copyright © 2011-2022 走看看