XML解析——多种解析方式

Schema(有兴趣可以看看):books.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/books"
	xmlns:tns="http://www.example.org/books" elementFormDefault="qualified">
	<element name="books">
		<complexType>
			<sequence>
				<element name="book" maxOccurs="unbounded">
					<complexType>
						<all>
							<element name="name" minOccurs="0"></element>
							<element name="author" minOccurs="0"></element>
							<element name="year" minOccurs="0"></element>
							<element name="price" minOccurs="0"></element>
							<element name="language" minOccurs="0"></element>
						</all>
						<attribute name="id" type="string" />
					</complexType>
				</element>
			</sequence>
		</complexType>
	</element>
</schema>

XML:books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books xmlns="http://www.example.org/books" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.example.org/books books.xsd">
	<book id="1">
		<name>冰与火之歌</name>
		<author>乔治马丁</author>
		<year>2014</year>
		<price>89</price>
	</book>
	<book id="2">
		<name>安徒生童话</name>
		<year>2004</year>
		<price></price>
		<language>English</language>
	</book>
</books>

一、DOM解析

       DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。
优点:
1、形成了树结构,有助于更好的理解、掌握,且代码容易编写。
2、解析过程中,树结构保存在内存中,方便修改。
缺点:
1、由于文件是一次性读取,所以对内存的耗费比较大。
2、如果XML文件比较大,容易影响解析性能且可能会造成内存溢出。

代码实例:

public void testDOM() {
		//创建DocumentBuilder工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		//是否对XML名称空间的支持 node.getNamespaceURI()
		factory.setNamespaceAware(true);
		try {
			//通过DocumentBuilder工厂创建DocumentBuilder
			DocumentBuilder builder = factory.newDocumentBuilder();
			//通过DocumentBuilder对象的parser方法加载books.xml文件
			Document document = builder.parse("books.xml");
			//获取document根节点
			Element element = document.getDocumentElement();
			//获取更节点下所有的子节点
			NodeList books = element.getChildNodes();
			for (int i = 0; i < books.getLength(); i++) {
				Node node = books.item(i);
				if ("book".equals(node.getNodeName()) || "book".equals(node.getLocalName())) {
					System.out.println("id=" + node.getAttributes().getNamedItem("id").getNodeValue());
					NodeList children = node.getChildNodes();
					for (int j = 0; j < children.getLength(); j++) {
						Node child = children.item(j);
						if (child.getNodeType() == Node.ELEMENT_NODE) {
							System.out.println(child.getNodeName() + "=" + child.getTextContent());
						}
					}
					System.out.println();
				}
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

二、SAX解析

       SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。

优点:
1、采用事件驱动模式,对内存耗费比较小。
2、适用于只处理XML文件中的数据时。
缺点:
1、编码比较麻烦。
2、很难同时访问XML文件中的多处不同数据。

代码实例:

public void testSAX() {
		//创建SAXParser工厂
		SAXParserFactory factory = SAXParserFactory.newInstance();
		try {
			//通过SAXParser工厂创建SAXParser
			SAXParser parser = factory.newSAXParser();
			//解析xml文件 DefaultHandler为xml文件解析处理器
			parser.parse("books.xml", new DefaultHandler() {
				private boolean isElementNode;

				@Override
				public void startElement(String uri, String localName, String qName, Attributes attributes)
						throws SAXException {
					if ("books".equals(qName) || "books".equals(localName)) {

					} else if ("book".equals(qName) || "book".equals(localName)) {
						System.out.println("id=" + attributes.getValue("id"));
					} else {
						isElementNode = true;
						System.out.print(qName + "=");
					}
				}

				@Override
				public void characters(char[] ch, int start, int length) throws SAXException {
					String value = new String(ch, start, length).trim();
					if (isElementNode) {
						System.out.println(value);
						isElementNode = false;
					}
				}

				@Override
				public void endElement(String uri, String localName, String qName) throws SAXException {
					if ("book".equals(qName) || "book".equals(localName)) {
						 System.out.println();
					}

				}

			});
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

三、JDOM解析

特征:1、仅使用具体类,而不使用接口。2、API大量使用了Collections类

优点:1 是基于树的处理XML的Java API,把树加载在内存中
        2 没有向下兼容的限制,因此比DOM简单
        3 速度快,缺陷少
        4 具有SAX的JAVA规则
缺点:1 不能处理大于内存的文档
        2 JDOM表示XML文档逻辑模型。不能保证每个字节真正变换。
        3 针对实例文档不提供DTD与模式的任何实际模型。
        4 不支持与DOM中相应遍历包

代码示例:

public void testJDOM(){
		//实例化SAXBuilder
		SAXBuilder  builder=new SAXBuilder();
		try {
			//构建document
			org.jdom.Document document=builder.build(new File("books.xml"));
			//获取document 根节点
			org.jdom.Element root=document.getRootElement();
			List<org.jdom.Element> elements=root.getChildren();
			for(org.jdom.Element book:elements){
				System.out.println("id="+book.getAttributeValue("id"));
				List<org.jdom.Element> attrElements= book.getChildren();
				for(org.jdom.Element attrElement:attrElements){
					System.out.println(attrElement.getName()+"="+attrElement.getValue());
				}
				System.out.println();
			}
		} catch (JDOMException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

4、DOM4J解析

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

public void testDOM4J(){
		SAXReader reader=new SAXReader();
		try {
			org.dom4j.Document document=reader.read("books.xml");
			org.dom4j.Element root=document.getRootElement();
			for(org.dom4j.Element book:(List<org.dom4j.Element>)root.elements()){
				System.out.println("id="+book.attributeValue("id"));
				List<org.dom4j.Element> attrElements= book.elements();
				for(org.dom4j.Element attrElement:attrElements){
					System.out.println(attrElement.getName()+"="+attrElement.getStringValue());
				}
				System.out.println();
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}

网页解析

 jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

public void testJSOUP(){
		try {
			//解析网页文件,这里只是做演示(XML解析大材小用了)
			org.jsoup.nodes.Document document=Jsoup.parse(new File("books.xml"), "utf-8");
			List<org.jsoup.nodes.Element> books=document.getElementsByTag("book");
			for(org.jsoup.nodes.Element book:books){
				System.out.println("id="+book.attr("id"));
				List<org.jsoup.nodes.Element> nodes=book.children();
				for(org.jsoup.nodes.Element node:nodes){
					System.out.println(node.nodeName()+"="+node.text());
				}
				System.out.println();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

猜你喜欢

转载自blog.csdn.net/weixin_44416039/article/details/85885951