java解析xml的4中方法

java解析xml的4中方式

xml文档内容

<?xml version="1.0" encoding="UTF-8"?>
<books>
	<book id="_1">
		<name>java</name>
		<author>Judes</author>
	</book>
	<book id="_2">
		<name>maven</name>
		<author>Kandy</author>
	</book>
</books>

DOM解析

package com.hwhz.sjc.java.xml;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * 采用dom解析xml文档
 * 优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能
 * 缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;
 * @author Administrator
 *
 */
public class DomXmlJava {
	static public void main(String[] args){
		try {
			File file = new File("C:/Documents and Settings/Administrator/Workspaces/MyEclipse 8.6/java-xml/src/main/java/test.xml");
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			DocumentBuilder db = dbf.newDocumentBuilder();
			/**
			 * getDocumentElement() 返回一个代表这个DOM树的根节点的Element对象,也就是代表XML文档根元素的那个对象。
			 * getElementsByTagName(String):返回一个NodeList对象,它包含了所有给定标签名字的标签。
			 * normalize() 将文档标准化,去除无用的空格和空行,即删除无用的text node  
			 */
			Document doc = db.parse(file);
			doc.normalize();
			/**
			 * 是DOM结构中最为基本的对象,代表了文档树中的一个抽象的节点
			 * getFirstChild():如果节点存在子节点,则返回第一个子节点,对等的,还有getLastChild()方法返回最后一个子节点。
			 * getNextSibling():返回在DOM树中这个节点的下一个兄弟节点,对等的,还有getPreviousSibling()方法返回其前一个兄弟节点。
			 * getNodeName():根据节点的类型返回节点的名称。
			 * getNodeType():返回节点的类型。
			 * getNodeValue():返回节点的值.
			 * hasChildNodes():判断是不是存在有子节点。
			 * hasAttributes():判断这个节点是否存在有属性。
			 * getOwnerDocument():返回节点所处的Document对象。
			 */
			Node node = doc.getFirstChild();
			System.out.println(node.getNodeName());
			/**
			 * 就是代表了一个包含了一个或者多个Node的列表。
			 * getLength():返回列表的长度。
			 * item(int):返回指定位置的Node对象。
			 */
			NodeList nodeList = doc.getElementsByTagName("book");
			for (int i = 0; i < nodeList.getLength(); i++) {
				/**
				 * 代表的是XML文档中的标签元素,继承于Node,亦是Node的最主要的子对象
				 * getElementsByTagName(String):返回一个NodeList对象,它包含了在这个标签中其下的子孙节点中具有给定标签名字的标签。
				 * getTagName():返回一个代表这个标签名字的字符串。
				 * getAttribute(String):返回标签中给定属性名称的属性的值。在这儿需要主要的是,应为XML文档中允许有实体属性出现,而这个方法对这些实体属性并不适用。这时候需要用到getAttributeNodes()方法来得到一个Attr对象来进行进一步的操作。
				 * getAttributeNode(String):返回一个代表给定属性名称的Attr对象。
				 */
				Element element = (Element)nodeList.item(i);
				/**
				 * 代表了某个标签中的属性。Attr继承于Node,但是因为Attr实际上是包含在Element中的,它并不能被看作是Element的子对象,因而在DOM中Attr并不是DOM树的一部分,所以Node中的getParentNode(),getPreviousSibling()和getNextSibling()返回的都将是null
				 */
				@SuppressWarnings("unused")
				Attr attr = null;
				System.out.print("id :" + element.getAttribute("id") + ";");
				System.out.print("name :" + element.getElementsByTagName("name").item(0).getTextContent() + "; ");
				System.out.println("author :" + element.getElementsByTagName("author").item(0).getTextContent());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

SAX解析

package com.hwhz.sjc.java.xml;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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 Administrator
 *
 */
public class SaxXmlJava extends DefaultHandler{
	
	public List<Object> list = null;
	public Map<String, Object> maps = null;
	private String preTag = null;
	
	public static void main(String[] args) {
		try {
			File file = new File("C:/Documents and Settings/Administrator/Workspaces/MyEclipse 8.6/java-xml/src/main/java/test.xml");
			SAXParserFactory factory = SAXParserFactory.newInstance();
			SAXParser parser = factory.newSAXParser();
			SaxXmlJava saxHandler = new SaxXmlJava();
			parser.parse(file, saxHandler);
			List<Object> list = saxHandler.getResultList();
			System.out.println(list.size());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public void startDocument() throws SAXException {
		list = new ArrayList<Object>();
	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		if("book".equals(qName)){
			maps = new HashMap<String, Object>();
			maps.put("id", attributes.getValue(0));
			System.out.println(attributes.getValue(0));
		}
		preTag = qName;
	}
	
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		if("book".equals(qName)){
			list.add(maps);
			maps = null;
		}
		preTag = null;
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		if(preTag != null){
			String content = new String(ch, start, length);
			if("name".equals(preTag)){
				maps.put("name", content);
			}else if("author".equals(preTag)){
				maps.put("author", content);
			}
		}
	}
	
	public List<Object> getResultList(){
		return list;
	}
}

Dom4J解析

package com.hwhz.sjc.java.xml;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * Dom4J解析xml
 * @author Administrator
 *
 */
public class Dom4JXmlJava {
	
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		try {
			List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
			Map<String, Object> map = null;
			File file = new File("C:/Documents and Settings/Administrator/Workspaces/MyEclipse 8.6/java-xml/src/main/java/test.xml");
			SAXReader reader = new SAXReader();
			Document doc = reader.read(file);
			Element element = doc.getRootElement();
			for (Iterator<Element> iterator = element.elementIterator("book"); iterator.hasNext();) {
				map = new HashMap<String, Object>();
				Element elements = iterator.next();
				Attribute idAttr = elements.attribute("id");
				map.put("id", idAttr.getText());
				for (Iterator<Element> iterInner = elements.elementIterator(); iterInner.hasNext();) {
					Element elementInner = iterInner.next();
					if(elementInner.getName().equals("name")){
						map.put("name", elementInner.getText().trim());
					}else if (elementInner.getName().equals("author")) {
						map.put("author", elementInner.getText().trim());
					}
				}
				list.add(map);
			}
			System.out.println(list.size());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

JDOM解析

package com.hwhz.sjc.java.xml;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

/**
 * Jdom解析xml
 * @author Administrator
 *
 */
public class JdomXmlJava {
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		try {
			List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
			Map<String, Object> map = null;
			SAXBuilder builder = new SAXBuilder();
			File file = new File("C:/Documents and Settings/Administrator/Workspaces/MyEclipse 8.6/java-xml/src/main/java/test.xml");
			//获取文档对象
			Document doc = builder.build(file);
			//获取根元素节点
			Element root = doc.getRootElement();
			//获取根元素节点下面的所有子节点
			List<Element> elements = root.getChildren();
			/**
			 * 对子节点下面的节点内容进行遍历获取
			 */
			for (Element e : elements) {
				map = new HashMap<String, Object>();
				map.put("id", e.getAttribute("id").getValue());
				map.put("name", e.getChildText("name"));
				map.put("author", e.getChildText("author"));
				list.add(map);
			}
			System.out.println(list.size());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值