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();
}
}
}