java 解析xml檔案
一、SAX:基於事件流的解析
優點:不用事先調入整個文件,佔用資源少;SAX解析器程式碼比DOM解析器程式碼小,適於Applet,下載。
缺點:不是持久的;事件過後,若沒儲存資料,那麼資料就丟了;無狀態性;從事件中只能得到文字,但不知該文字屬於哪個元素;
使用場合:Applet;只需XML文件的少量內容,很少回頭訪問;機器記憶體少;
步驟:
1、獲取解析工廠
2、獲取解析器
3、載入文件Document 註冊處理器
package xmlParse.sax; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; /** * @author:zhangfd * @version:1.0 * @date:2017年10月11日 下午11:02:57 * @description:sax解析xml檔案 */ public class XmlParse01 { public static void main(String[] args) throws Exception { //1、獲取解析工廠 SAXParserFactory factory = SAXParserFactory.newInstance(); //2、獲取解析器 SAXParser saxParser = factory.newSAXParser(); //3、編寫自定義的處理器,需要繼承DefaultHandler PersonHandler handler = new PersonHandler(); //4、載入文件Document 註冊處理器 saxParser.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("\\xmlParse\\sax\\person.xml"), handler); for (Person person : handler.getPersons()) { System.out.println(person.getName()+"--->"+person.getAge()); } } }
package xmlParse.sax; /** * @author:zhangfd * @version:1.0 * @date:2017年10月11日 下午11:00:21 * @description: */ public class Person { private String name ; private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }
package xmlParse.sax; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * @author:zhangfd * @version:1.0 * @date:2017年10月11日 下午11:10:45 * @description: 實現DefaultHandler 類的5個方法,依次為startDocument、startElement、characters、endElement、endDocument */ public class PersonHandler extends DefaultHandler{ private List<Person> persons ; private Person person; private String tag = null; @Override public void startDocument() throws SAXException { //System.out.println("開始處理文件"); persons = new ArrayList<Person>(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("開始處理元素"+qName); tag = qName; if("person".equals(qName)){ person = new Person(); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { String s = new String(ch, start, length); if("name".equals(tag)){ person.setName(s); }else if("age".equals(tag)){ person.setAge(s); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println("結束處理元素"+qName); if("person".equals(qName)){ persons.add(person); } tag = null; } @Override public void endDocument() throws SAXException { System.out.println("結束處理文件"); } public List<Person> getPersons() { return persons; } public void setPersons(List<Person> persons) { this.persons = persons; } }
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person>
<name>zhangsan</name>
<age>100</age>
</person>
<person>
<name>lisi</name>
<age>25</age>
</person>
</persons>
二、DOM:基於XML文件樹結構的解析
解析器讀入整個文件,然後構建一個駐留記憶體的樹結構,然後程式碼就可以使用 DOM 介面來操作這個樹結構。
優點:整個文件樹在記憶體中,便於操作;支援刪除、修改、重新排列等多種功能;
缺點:將整個文件調入記憶體(包括無用的節點),浪費時間和空間;
使用場合:一旦解析了文件還需多次訪問這些資料;硬體資源充足(記憶體、CPU)。
步驟:
1、獲得解析工廠
2、獲得解析器
3、獲取Document,根據節點名,解析xml文件
package xmlParse.dom;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* @author:zhangfd
* @version:1.0
* @date:2017年10月15日 下午1:14:21
* @description: dom解析xml檔案
*/
public class Xmlparse02 {
public static void main(String[] args) throws Exception {
//1、獲取document工廠
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//2、建立構造器
DocumentBuilder docBuilder = factory.newDocumentBuilder();
//3、建立document
Document document = docBuilder.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("\\xmlParse\\dom\\person.xml"));
//Element root = document.getDocumentElement();
NodeList personList = document.getElementsByTagName("person");
List<Person> pList = new ArrayList<Person>();
for (int i =0;i<personList.getLength();i++){
Person p = new Person();
Element person = (Element) personList.item(i);
String nameValue = person.getElementsByTagName("name").item(0).getTextContent();
String ageValue = person.getElementsByTagName("age").item(0).getTextContent();
p.setAge(ageValue);
p.setName(nameValue);
pList.add(p);
}
for (Person person : pList) {
System.out.println(person.getAge()+"------"+person.getName());
}
}
}
Person類和person.xml檔案和上類相同。
下面抽象出一個DOM解析的通用類:
package xmlParse;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.commons.lang.StringUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import xmlParse.dom.Person;
/**
* @author:zhangfd
* @version:1.0
* @date:2017年10月15日 下午2:45:30
* @description: DOM解析xml檔案通用類, 返回Document物件
*/
public class DomParseXmlUtil {
private DocumentBuilder docBuilder;
private Document document;
private static String CHARSET = "utf-8";
public DomParseXmlUtil() {
init();
}
/**
*
* @param xmlContent 需要解析的xml內容
* @param charset 解析使用的編碼
*/
public DomParseXmlUtil(String xmlContent, String charset) {
this();
if(StringUtils.isNotBlank(charset))
DomParseXmlUtil.CHARSET = charset;
if(null != docBuilder){
try {
this.document = docBuilder.parse(new ByteArrayInputStream(xmlContent.getBytes(charset)));
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 預設採用utf-8編碼格式
* @param xmlContent 需要解析的xml檔案
*/
public DomParseXmlUtil(String xmlContent){
this(xmlContent,CHARSET);
}
private void init(){
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
docBuilder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
docBuilder = null;
}
}
public static void main(String[] args) throws Exception {
InputStream ins = Thread.currentThread().getContextClassLoader().getResourceAsStream("\\xmlParse\\dom\\person.xml");
String xmlContent = covertionInputStreamToString(ins,null);
DomParseXmlUtil domParseXmlUtil = new DomParseXmlUtil(xmlContent);
Document document = domParseXmlUtil.getDocument();
if(null != document){
NodeList personList = document.getElementsByTagName("person");
List<Person> pList = new ArrayList<Person>();
for (int i =0;i<personList.getLength();i++){
Person p = new Person();
Element person = (Element) personList.item(i);
String nameValue = person.getElementsByTagName("name").item(0).getTextContent();
String ageValue = person.getElementsByTagName("age").item(0).getTextContent();
p.setAge(ageValue);
p.setName(nameValue);
pList.add(p);
}
for (Person person : pList) {
System.out.println(person.getAge()+"------"+person.getName());
}
}
}
/**
* 輸入流轉化為字串 預設使用utf-8編碼
* @param ins 輸入流
* @return
*/
public static String covertionInputStreamToString(InputStream ins,String chaeSet){
try {
if(StringUtils.isNotEmpty(chaeSet)){
DomParseXmlUtil.CHARSET = chaeSet;
}
BufferedReader bf = new BufferedReader(new InputStreamReader(ins,CHARSET ));
String line = null;
StringBuilder sb = new StringBuilder();
while(null != (line=bf.readLine())){
sb.append(line+"\n");
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public Document getDocument() {
return document;
}
public void setDocument(Document document) {
this.document = document;
}
}
以上兩種為java自帶的xml檔案解析,下面介紹兩種關於解析xml比較優秀的框架
三、DOM4J生成和解析XML文件
package xmlParse.dom4j;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Iterator;
import org.apache.commons.lang.StringUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
/**
* @author:zhangfd
* @version:1.0
* @date:2017年10月15日 下午4:50:03
* @description:
*/
public class Dom4jReaderXml {
public static void main(String[] args) {
//存放xml文件
String xmlContent="";
//1、定義解析器
SAXReader saxReader = new SAXReader();
try {
InputStream ins = Thread.currentThread().getContextClassLoader().getResourceAsStream("\\xmlParse\\dom4j\\person.xml");
xmlContent = covInputStreamToString(ins);
//2、讀取xml內容,存放在document物件中
org.dom4j.Document document = saxReader.read(new ByteArrayInputStream(xmlContent.getBytes("utf-8")));
//3、獲取根節點資訊
org.dom4j.Element rootElement = document.getRootElement();
//獲取子節點名和對應的值
getChildNodes(rootElement);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
//獲取節點名和對應的值
public static void getChildNodes(Element element){
for (Iterator<?> j = element.elementIterator(); j.hasNext();) {
Element node = (Element) j.next();
if(StringUtils.isNotBlank(node.getText()))
System.out.println(node.getName() + ":" + node.getText());
getChildNodes(node);
}
}
public static String covInputStreamToString(InputStream ins){
try {
BufferedReader bf = new BufferedReader(new InputStreamReader(ins, "utf-8"));
String line = null;
StringBuilder sb = new StringBuilder();
while(null != (line=bf.readLine())){
sb.append(line+"\n");
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person>
<name>zhangsan</name>
<age>100</age>
<wo>
<per>wodn</per>
</wo>
</person>
<person>
<name>lisi</name>
<age>25</age>
</person>
</persons>
相關推薦
Java解析xml檔案的方式
import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; impo
Java解析XML檔案的常用方法介紹
1 import java.io.IOException; 2 3 import javax.xml.parsers.DocumentBuilder; 4 import javax.xml.parsers.DocumentBuilderFactory; 5 import javax.x
Java解析xml檔案遇到“unknown protocol: c Nested exception: unknown protocol: c”問題的解決辦法
在寫畢設的時候在解析XML檔案的時候遇到的一個棘手的問題“unknown protocol: c Nested exception: unknown protocol: c”,翻閱了資料說是tomcat的安裝路徑不能有空格,要麼重新安裝tomcat,要麼以檔案的形式進行解析,
Java解析xml檔案之增刪改查
XML是什麼: 可擴充套件的標記語言 XML能幹什麼: 描述資料、儲存資料、傳輸(交換)資料。 XML文件節點型別: u 文件(document) u 元素(element) u 屬性(attribu
java解析xml檔案讀取本地dtd或者忽略dtd
Java程式在解析xml檔案時,如果xml檔案中指定了dtd,在預設會從指定的url下載dtd檔案,但是很多情況下如果網路連線不上,或者防火牆原因,dtd檔案無法下載下來導致程式報連線超時異常,解析xml失敗。有兩種方法解決該類問題: 1.指定從本地讀取dtd檔案 若要解析
Java解析XML檔案的四種方式
1 import javax.xml.parsers.SAXParser; 2 import javax.xml.parsers.SAXParserFactory; 3 4 import org.xml.sax.Attributes; 5 import org.xml.sax
java解析xml檔案四種方式
1.介紹 1)DOM(JAXP Crimson解析器) DOM是用與平臺和語言無關的方式表示XML文件的官方W3C標準。DOM是以層次結構組織的節點或資訊片斷的集合。這個層次結構允許開發人員在樹中尋找特定資訊。分析該結構通常需要載入整個文件和構造層次結構,然後才能做任何工作。由於它是基於資訊層次的,因而
java 解析xml檔案
一、SAX:基於事件流的解析優點:不用事先調入整個文件,佔用資源少;SAX解析器程式碼比DOM解析器程式碼小,適於Applet,下載。缺點:不是持久的;事件過後,若沒儲存資料,那麼資料就丟了;無狀態性;從事件中只能得到文字,但不知該文字屬於哪個元素;使用場合:Applet;只
Java解析xml檔案的方法
什麼是 XML? XML指可擴充套件標記語言(EXtensible Markup Language)XML 是一種標記語言,很類似 HTMLXML 的設計宗旨是傳輸資料,而非顯示資料XML 標籤沒有被預定義。您需要自行定義標籤。XML 被設計為具有自我描述性。XML 是
使用Java解析XML檔案或XML字串的例子
本文由Markdown語法編輯器編輯完成。 經驗與教訓: 因為是Java專案,未載入特定的jar包,而導致在解析XML檔案和字串時,發生了ClassNotFoundException。 在使
java解析xml檔案:建立、讀取、遍歷、增刪查改、儲存
全棧工程師開發手冊 (作者:欒鵬) java使用JDOM介面解析xml檔案,包含建立、增刪查改、儲存,讀取等操作。 需要引入jdom.jar,下載 xercesImpl.jar
Java解析xml檔案的4種方式
java解析xml分為兩類,4種,分別為SAX解析,dom解析,jdom,dom4j.以下具體舉例使用4種方式來實現對一個.xml檔案進行解析: 有命名為dome.xml的檔案, <?xml version="1.0" encoding="UTF-8"?> &l
Java上傳且後臺解析XML檔案
後臺程式碼: import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.InputStreamReader; import javax.
java對於xml檔案的四種解析方式
概述 XML是一種通用的資料交換格式,它的平臺無關性、語言無關性、系統無關性、給資料整合與互動帶來了極大的方便。XML在不同的語言環境中解析方式都是一樣的,只不過實現的語法不同而已。 XML的解析方式分為四種:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析。其中
java後臺解析XML檔案
解析XML檔案分為兩種: 1、DOM(Document Object Model) 2、SAX(Simple API for XML) DOM是基於XML文件樹結構的解析,SAX是基於事件流的解析。 我用到的是SAX解析>> 一、XML檔案 <?xml
Java:簡單的解析XML檔案之使用DOM解析
XML簡介 要理解XML,HTML等格式,先來理解文件物件模型DOM 根據 DOM,HTML 文件中的每個成分都是一個節點,這些節點組成了一棵樹。DOM 是這樣規定的:整個文件是一個文件節點每個 HTML 標籤是一個元素節點包含在 HTML 元素中的文字是文字節點每一個 HTML 屬性是一個屬性節
java w3c解析xml檔案,獲取指定節點內容,讀取外部配置檔案。
原始碼: package com.ys.adage.utils; import com.ys.adage.message.CodeObjectResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.
java使用 dom4j解析xml檔案
步驟 1 匯入dom4j jar包,用Xpath的話吧jaxen包也匯入 2 dom4j具體寫法 xml檔案裡的內容 <?xml version="1.0" encoding="utf-8" ?> <stus> <stu>
Java中使用DOM方法解析XML檔案
Java中使用DOM方法解析XML檔案 1、簡介 XML現在已經成為一種通用的資料交換格式,平臺的無關性使得很多場合都需要用到XML,本部落格將介紹用DOM方法解析XML檔案的方法,DOM解析是將XML檔案全部載入到記憶體,組裝成一顆DOM樹,然後通過節點以及節點之間的關係來解析XM
Java用String 擷取方式解析xml檔案、處理大xml檔案
對於小資料返回值直接可採用Document、element的解析方式即可獲得xml節點值。 但對於返回值大於10M的資料,Document解析就顯得吃力甚至出現程式中斷情況。針對返回資料大的xml可採取Java String 分割擷取方式處理。 如下報文返回的是銀行資訊,程式需要獲得Ba