XML之Sax(simple api for xml )解析:
主實現類:
package com.xml;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.junit.Test;
import org.xml.sax.SAXException;
/*
* Sex解析的特點:
* 1.基於事件的讀取
* 2.基於順序的讀取,速度快
* 3.不能任意讀取節點(靈活性差一些)
* 4.sex更適用於在要求跟高的設備上使用(Android開發中);
* 5.解析時佔用內存小
*/
public class ImplementsXML {
@Test
public static void saxparsemxl() {
//1.創建一個sax解析工廠對象
SAXParserFactory spf=SAXParserFactory.newInstance();
//2.通過工廠對象創建sax解析器
try {
SAXParser sp= spf.newSAXParser();
//3.創建一個數據處理器(需要我們自己來編寫)
dataParser dp=new dataParser();
//4.開啓解析
InputStream is= Thread.currentThread().getContextClassLoader().getResourceAsStream("com/xml/NewFile.xml");
try {
//參數一輸入文件字節流 /參數二 自己編寫的數據處理器
sp.parse(is,dp);
ArrayList<person> p=dp.getPersons();
//通過for循環輸出對象
for(person p1:p) {
System.out.println(p1);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
//調用解析xml的方法
saxparsemxl();
}
}
數據處理器類:
package com.xml;
import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class dataParser extends DefaultHandler {
private ArrayList<person> persons=new ArrayList<person>();
private person p;//當前正在解析的person對象
private String tag;//用於記錄正在解析的標籤名
public ArrayList<person> getPersons() {
return persons;
}
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
;
System.out.println("開啓解析文檔>>>>>>>>>");
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("文檔解析結束.");
}
//解析開始元素時調用
/*
* String 命名空間, String 不帶前綴的標籤名字, String 不帶前綴的標籤名字, Attributes 當前標籤的屬性集合
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
//表示解析到了person標籤
if("person".equals(qName)) {
p=new person();
String id=attributes.getValue("person");
//設置id
p.setId(id);
}
tag=qName;
System.out.println("startElement"+qName);
}
//解析結束元素時調用
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
if("person".equals(qName)) {
persons.add(p);
tag=null;
}
System.out.println("endElement"+qName);
}
//解析文本時調用
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
if(tag !=null) {
if("name".equals(tag)){
p.setName(new String(ch,start,length));
}else if("address".equals(tag)) {
p.setAddress(new String (ch,start,length));
}else if("tel".equals(tag)) {
p.setTel(new String (ch,start,length));
}else if("fax".equals(tag)) {
p.setFax(new String (ch,start,length));
}else if("email".equals("tag")) {
p.setEmail(new String (ch,start,length));
}
}
System.out.println(ch);
}
}
解析的對象person類
package com.xml;
public class person {
private String name;
private String address;
private String email;
private String tel;
private String fax;
private String id;
public person() {
super();
// TODO Auto-generated constructor stub
}
public person(String name, String address, String email, String tel, String fax, String id) {
super();
this.name = name;
this.address = address;
this.email = email;
this.tel = tel;
this.fax = fax;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getFax() {
return fax;
}
public void setFax(String fax) {
this.fax = fax;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public String toString() {
return "person [name=" + name + ", address=" + address + ", email=" + email + ", tel=" + tel + ", fax=" + fax
+ ", id=" + id + "]";
}
}
xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<persion>
<person id="p1">
<name>小紅</name>
<address>上海</address>
<tel>100886</tel>
<fax>001100</fax>
<email>[email protected]</email>
</person>
<person id="p2">
<name>小明</name>
<address>上海</address>
<tel>189886</tel>
<fax>011110</fax>
<email>[email protected]</email>
</person>
</persion>
XML之Dom(document Object Modo)解析:
package com.xml;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/*
* DOM解析mxl
* 1.基於樹形結構,通過解析器一次性把文檔加載到內存中,
* 會比較佔用內存,可以隨機訪問,跟適用於web開發中使用
*/
public class domeParserXml {
public static void parset() {
//1.創建一個dom解析器工廠
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//2.通過工廠對象創建解析器對象
//4.從內存中讀取數據
try {
DocumentBuilder db=factory.newDocumentBuilder();
//3.解析文檔
InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("com/xml/NewFile.xml");
try {
//此代碼執行後整個xml已經加載到內存當中,以樹狀形式存儲
Document doc=db.parse(is);//通過解析器進行解析
//返回一個NodeList節點
person p=null;
NodeList nl=doc.getElementsByTagName("person");
ArrayList<person> persons=new ArrayList<>();
//遍歷NodeList節點
//獲取屬性值
for(int i=0;i<nl.getLength();i++) {
Node personNode=nl.item(i);
p=new person();
String s=personNode.getAttributes().getNamedItem("id").getNodeValue();
p.setId(s);
//獲取當前節點的所有子節點
NodeList childNodel=doc.getChildNodes();
for(int j=0;j<childNodel.getLength();j++) {
Node item=childNodel.item(j);
String nodename=item.getNodeName();
if("name".equals(nodename)) {
p.setName(item.getFirstChild().getNodeValue());
}else if("address".equals(nodename)) {
p.setAddress(item.getFirstChild().getNodeValue());
}else if("email".equals(nodename)) {
p.setEmail(item.getFirstChild().getNodeValue());
}else if("fax".equals(nodename)) {
p.setFax(item.getFirstChild().getNodeValue());
}else if("tel".equals(nodename)) {
p.setTel(item.getFirstChild().getNodeValue());
}
persons.add(p);
}
for(person person:persons) {
System.out.println(person);
}
}
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
parset();
}
}
XML之JDom(java document Object Modo)解析:
package com.xml;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
/*
* JDOM解析 xml
* 1.於dom類似,都是基於樹形結構
* 2.於dom的區別
* (1)第三方開源的組件
* (2)實現使用java的collection接口
* (3)效率比DOM更快
*
*/
public class JDomParserXml {
public static void parser() {
//創建JDOM解析器
//注意他不是SAX,只是名字叫SAX
SAXBuilder sb=new SAXBuilder();
InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("com/xml/NewFile.xml");
try {
//開始解析
Document build=sb.build(is);
//獲取根節點
Element rootelemnt =build.getRootElement();
List<person> list=new ArrayList<>();
person person=null;
//根節點根節點獲取子元素:返回list person對象集合
List<Element> childList=rootelemnt.getChildren();
for(Element element:childList ) {
person=new person();
String id=element.getAttributeValue("id");
person.setId(id);
List<Element> ChildrenList= element.getChildren();
for(Element e:ChildrenList ) {
//取到標籤名字
String tag=e.getName();
if("name".equals(tag)) {
person.setName(e.getText());
}else if("address".equals(tag)) {
person.setAddress(e.getText());
}else if("email".equals(tag)) {
person.setEmail(e.getText());
}else if("fax".equals(tag)) {
person.setFax(e.getText());
}else if("tel".equals(tag)) {
person.setTel(e.getText());
}
}
list.add(person);
}
for(person p:list) {
System.out.println(p);
}
} catch (JDOMException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
parser();
}
}
XML之Dom4J(document Object Modo for java)解析:
注意4j不念4,而是讀for
package com.xml;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/*
* JDOM解析 xml
* 1.於DOM,都是基於樹形結構
* 2.於第三方開源的組件,效率比DOM更快
* 3.JDOM和DOM在性能測試時性能表示不加,在測試10m文檔時內存溢出
* SAX表現較好,這事依賴與它的解析特性
* DOM4J是這場測試的獲勝者
*/
public class dom4jparser {
public static void parser() throws IOException {
//創建DOM4j解析器
SAXReader reader=new SAXReader();
InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("com/xml/NewFile.xml");
try {
//返回 DOM4j包中的的 document對象
Document dc=reader.read(is);
Element rootelement=dc.getRootElement();
//獲取迭代器
Iterator<Element> iterator=rootelement.elementIterator();
ArrayList<person> personList=new ArrayList<>();
person p=null;
//循環素如
while(iterator.hasNext()) {
p=new person();
Element e=iterator.next();
p.setId(e.attributeValue("id"));
//Iterator<Element> iterator1 = null;
while(iterator.hasNext()) {
Element name=iterator.next();
String tag=name.getName();
if("name".equals(tag)) {
p.setName(name.getText());
}else if("address".equals(tag)) {
p.setAddress(name.getText());
}else if("email".equals(tag)) {
p.setEmail(name.getText());
}else if("fax".equals(tag)) {
p.setFax(name.getText());
}else if("tel".equals(tag)) {
p.setTel(name.getText());
}
}
personList.add(p);
}
for(person pp:personList) {
System.out.println(pp);
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
parser();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
XmlDecoder和XmlEncoder解析xml文件
package com.xml;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class xmlDome {
//**************************XML編碼方法***************************
public static void xmlEnCoder() {
OutputStream out = null;
try {
out = new FileOutputStream("C:\\Users\\龍布天下\\Desktop\\long.xml");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
BufferedOutputStream bos=new BufferedOutputStream(out);
//創建編碼器
XMLEncoder xmlEncoder=new XMLEncoder(out);
person p=new person();
p.setName("小亮");
p.setAddress("上海");
p.setEmail("[email protected]");
p.setFax("05112");
p.setTel("100990");
p.setId("01");
xmlEncoder.writeObject(p);
xmlEncoder.close();
}
//**************************XML解碼方法***************************
public static void xmlDeCoder() {
InputStream in = null;
try {
in = new FileInputStream("C:\\Users\\龍布天下\\Desktop\\long.xml");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
XMLDecoder xmlDecoder=new XMLDecoder(in);
person p=(person) xmlDecoder.readObject();
System.out.println(p);
}
public static void main(String[] args) {
//調用編碼方法
xmlEnCoder();
//調用解碼方法
xmlDeCoder();
}
}
XStream工具解析xml文件
package com.xml;
import com.thoughtworks.xstream.io.xml.Xpp3DomDriver;
/*
* 使用xStream工具實現XML的解析與生成
*/
public class XStream {
public static void XStream() {
person p=new person();
p.setName("小亮");
p.setAddress("上海");
p.setEmail("[email protected]");
p.setFax("05112");
p.setTel("100990");
p.setId("01");
//創建XPP驅動
//Xpp3DomDriver xpp=new Xpp3DomDriver();
com.thoughtworks.xstream.XStream x=new com.thoughtworks.xstream.XStream(new Xpp3DomDriver());
//根節點取別名
x.alias("person",person.class);
//屬性值取別名
x.useAttributeFor(person.class,"id");
String s=x.toXML(p);
System.out.println(s);
//注意!!!!!!!!!!!!!!!!開始解析;
//返回person對象
person person=(com.xml.person) x.fromXML(s);
System.out.println(person);
}
public static void main(String[] args) {
//調用方法
XStream();
}
}
**
xml常用四種解析方式優缺點的分析
**
xml
最近用得到xml的解析方式,於是就翻了翻自己的筆記同時從網上查找了資料,自己在前人的基礎上總結了下,貼出來大家分享下。
首先介紹一下xml語言:
可擴展標記語言 (Extensible Markup Language, XML) ,用於標記電子文件使其具有結構性的標記語言,可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。
xml的語法:
XML 分爲兩部分:頭信息,主體信息
頭信息是用來描述 XML 的一些屬性,例如:版本,編碼等,還可以提供 XML 顯示的樣式,和 dtd 編寫格式。
主體信息中包含的是 XML 的具體數據。
頭信息的語法:
<?xml version =”1.0” encoding =”GBK” ?>
其中 version 是必須加的,而 encoding 可以不寫,則默認編碼是 ISO8859-1 ,不支持中文。
除了這個功能外,頭信息還可以進行編寫格式的規定,通過 dtd 或 xsd 文件。
頭信息還支持樣式表的導入,允許通過樣式表控制 XML 的顯示。
這樣可以使用 XML+ CSS 完成頁面的顯示,通過這種形式完成 MVC 中的 View 層:
優點:代碼的安全性很高,可以很容易的替換模板。
缺點:開發成本太高
主體信息 就是由三種節點組成的,節點之間存在父與子的關係,注意的點:
一個節點只能有一個父節點,如果沒有父節點,該節點稱爲根節點。
一個節點可以有多個子節點。只有元素節點可以擁有子節點。
元素節點的標記必須成對出現,或直接結束。
特殊字符必須轉義。依據字符所處的位置是否對 XML 格式造成影響來決定是否進行轉義
根節點只能有一個
xml常用的四種解析方式:
1)DOM(Document Object Model)
文檔對象模型分析方式。以層次結構(類似於樹型)來組織節點和信息片段,映射XML文檔的結構,允許獲取和操作文檔的任意部分。是W3C的官方標準。
優點:
1、允許應用程序對數據和結構做出更改。
2、訪問是雙向的,可以在任何時候在樹中上下導航,獲取和操作任意部分的數據。
缺點:
1、通常需要加載整個XML文檔來構造層次結構,消耗資源大
2)SAX(Simple API for XML)
流模型中的推模型分析方式。通過事件驅動,每發現一個節點就引發一個事件,通過回調方法完成解析工作,解析XML文檔的邏輯需要應用程序完成。
優點:
1、不需要等待所有數據都被處理,分析就能立即開始。
2、只在讀取數據時檢查數據,不需要保存在內存中。
3、可以在某個條件得到滿足時停止解析,不必解析整個文檔。
4、效率和性能較高,能解析大於系統內存的文檔。
缺點:
1、需要應用程序自己負責TAG的處理邏輯(例如維護父/子關係等),使用麻煩。
2、單向導航,很難同時訪問同一文檔的不同部分數據,不支持XPath。
3)JDOM(Java-based Document Object Model)
Java特定的文檔對象模型。自身不包含解析器,使用SAX。
優點:
1、使用具體類而不是接口,簡化了DOM的API。
2、大量使用了Java集合類,方便了Java開發人員。
缺點:
1、沒有較好的靈活性。
2、性能較差。
4)DOM4J(Document Object Model for Java)
簡單易用,採用Java集合框架,並完全支持DOM、SAX和JAXP。
優點:
1、大量使用了Java集合類,方便Java開發人員,同時提供一些提高性能的替代方法。
2、支持XPath。
3、有很好的性能。
缺點:
1、大量使用了接口,API較爲複雜。