java对xml文件的解析_Java对XML文件的解析
XML簡介
圍繞XML涉及到四方面的技術(shù):
1、數(shù)據(jù)定義Schema、DTD
2、數(shù)據(jù)解析DOM、SAX兩種解析模型
3、樣式風格XSTL,使用XSTL可以將XML文件中存放的內(nèi)容按照指定的樣式顯示為HTML頁面
4、實現(xiàn)語言JAVA,NET,JavaScript等,幾乎所有的程序語言都提供支持。所有操作XML的功能都有額外的語言提供。另Java中可以使用SAX、JDOM、dom4j等API操作XML數(shù)據(jù)。
基本語法:
聲明<?xml version=”1.0” encoding=”UTF-8”?>
XML聲明不屬于xml元素,所以不需要結(jié)束標記。
XML文檔只有一個根元素,必須包含一個單獨的標記來定義整個文檔。
XML是大小寫敏感的。
轉(zhuǎn)移字符:當某個節(jié)點的數(shù)據(jù)包含大量需要轉(zhuǎn)義的字符時,可以使用CDATA
以結(jié)束,其所包含的文本都會被當做普通文本處理,所有的特殊符號都會被忽略掉。但其中不能再包含CDATA,注意標簽不能有空格。
XML解析
DOM解析
DOM解析(Document Object Mode)是一種基于對象的API,它把XML的內(nèi)容加載到內(nèi)存中,生成一個與XML文檔內(nèi)容對應的對象模型。當解析完成時,內(nèi)存中會生成與XML文檔的結(jié)構(gòu)對應的DOM對象樹。這樣便能夠根據(jù)樹的結(jié)構(gòu),以節(jié)點形式來對文檔進行操作。
特點:對于小的XML文件這樣處理很方便,但遇到大的XML文件時,DOM解析占用內(nèi)存比較大,而且查找速度比較慢。
通過以下三個步驟創(chuàng)建XML文件對應的Document對象:
DocumentBuilderFactorybuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder =builderFactory.newDocumentBuilder();
Document document = builder.parse(file);
其他方法可參考JDK,javax.xml.*; org.w3c.dom.
SAX解析
SAX解析器對XML文檔解析會從XML文檔開始位置起進行解析,同時根據(jù)已經(jīng)定義好的事件處理器,來決定當前所解析的部分(元素、屬性或元素內(nèi)容)是否有必要記錄并存儲。
特點:效率比DOM解析優(yōu)越。
SAX解析是事件驅(qū)動的,需要定義一個事件監(jiān)聽對象(可繼承DefaultHandler類)
通過如下三個步驟建立XML解析對象:
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse(newFile(""),newDefaultHandler());
其他具體方法可參考JDK:org.xml.sax.*; javax.xml.parsers.
DOM和SAX都是JDK提供的解析XML的API,但是在實際開發(fā)中很少用到,因為要重新編寫大量的代碼。
XML與Java類(POJO類)映射JAXB
Java對象轉(zhuǎn)化成XML,marshal
XML轉(zhuǎn)化為Java對象,unmarshal
此方法也是JDK提供的:javax.xml.bind.*
注解:
Dom4j
dom4j的一個工具類:package com.xml.dom4j;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
/**
*dom4j的學習可參考官網(wǎng)
*下載官網(wǎng):
*http://sourceforge.net/projects/dom4j/files/dom4j-2.0.0-ALPHA-2/
*學習詳細用法可參考具體官方API接口文檔說明
*/
public class XmlUtil {
/**
* tagName=list
* 理解element是什么東西
* Element interface defines an XML element.
* An element can have declared namespaces, attributes, child nodes and textual content
* http://hi.daidu.com/331703405/item/d3a7388916fcc8d75e0c1d1
* @param document
* @param nameSpace
* @param tagName
* @return
*/
public static List getElementsByNameSpace(Document document, String nameSpace, String tagName){
Map map = new HashMap();
map.put("ns", nameSpace);
XPath xPath = document.createXPath("//ns:" + tagName);
xPath.setNamespaceURIs(map);
List list = xPath.selectNodes(document);
return list;
}
/**
* 一般項目處理的時候也可用字符串StringBuffer拼接報文
* 當大量的xml需要的時侯可用模板Freemarker模塊
* @param document
* @throws IOException
* 來自官網(wǎng)API說明文檔
*/
public void write(Document document) throws IOException {
// lets write to a file
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();
// Pretty print the document to System.out
OutputFormat format = OutputFormat.createPrettyPrint();
writer = new XMLWriter( System.out, format);
writer.write(document);
// Compact format to System.out
format = OutputFormat.createCompactFormat();
writer = new XMLWriter(System.out, format);
writer.write(document);
}
/**
* tagPaht = root.response.list
* @param document
* @param tagPath
* @return
*/
public static List getElementsByTagPath(Document document, String tagPath){
List list = null;
Element root = document.getRootElement();
String[] tags = tagPath.split("\\.");
if(tags[0].equals(root.getName())){
Element element = root;
for (int i = 1; i < tags.length; i++) {
if(i < tags.length - 1){
element = element.element(tags[i]);
if(element == null) break;
}else{
list = element.elements(tags[i]);
}
}
}
return list;
}
/**
* 通過路徑獲取標簽值
* tagPath = root.response.name
* @param document
* @param tagPath
* @return
*/
public static String getElementTextByTagPath(Document document, String tagPath){
String text = "";
Element root = document.getRootElement();
String[] tags = tagPath.split("\\.");
if(tags[0].equals(root.getName())){
Element element = root;
for (int i = 1; i < tags.length; i++) {
if(i < tags.length - 1){
element = element.element(tags[i]);
if(element == null) break;
}else{
text = element.elementText(tags[i]);
}
}
}
return text;
}
}
JDOM
總結(jié)
以上是生活随笔為你收集整理的java对xml文件的解析_Java对XML文件的解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中1代表什么,java中iamp
- 下一篇: asp.net ajax控件工具集 Au