xml中三種解析方式介紹
阿新 • • 發佈:2019-01-26
1)dom: 文件物件模型(Document Object Model) 官方推薦的標準
dom原理:會把我們要解析的整個xml載入到到記憶體中.在記憶體中形成一個樹形結構
優點:可以進行增刪改查
缺點:由於把整個文件載入到記憶體中.所以會造成記憶體洩露
2)sax: 簡單應用程式介面(Simple Api For Xml) 他不是官方推薦 是一個程式設計師社群研究出來
特點:一邊解析 一邊處理 一邊釋放記憶體
優點:不會有記憶體洩露
缺點: 不能進行增 刪 改
3)xmlpull解析:他是Android中內建的解析器,解析原理類似sax
1、dom解析實現
dom sax xmlpull只是三種解析的方式 或者說是解析的思想,他並沒有提供相應的api實現
sun公司提供了一套介面jaxp Java API for XML Processing 實現了dom 和 sax解析
dom解析會形成一個樹形結構
dom解析把xml元素 屬性 文字都當成是節點(node)
實現思路:通過工廠獲取解析器的例項 拿到解析器的例項後解析xml
具體實現步驟:
//[1]定義工廠
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//[2]通過工廠獲取解析器
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//[3]開始解析xml document代表整棵樹
Document document = documentBuilder.parse("bookstore.xml");
//[4]獲取我們想獲取的內容
NodeList elementsByTagNames = document.getElementsByTagName("name");
//[5]迴圈取出集合中每個節點
for(int i=0;i<elementsByTagNames.getLength();i++){
//[6]取出每個item5.
Node item = elementsByTagNames.item(i);
String content = item.getFirstChild().getTextContent();
//[7]取出書的名字
System.out.println("content:"+content);
}
2、sax解析實現
dom特點把整個文件載入到記憶體 sax思想是一邊解析一邊處理一邊釋放記憶體
具體實現程式碼步驟如下
//[1]構建工廠
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//[2]通過工廠獲取sax解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
//[3]開始解析xml 第二個引數是事件的處理器
saxParser.parse("bookstore.xml", new MyDefaultHandler());
}
//定義事件的處理器
class MyDefaultHandler extends DefaultHandler{
// 接收文件開始的通知。
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("文件開始");
}
// 接收元素開始的通知。
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
System.out.println("startElement");
}
//接收元素中字元(文字)資料的通知
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
String content = new String(ch, start, length);
if (content!=null&&content.trim().length()>0) {
System.out.println("characters--文字"+content);
}
}
//接收元素結束的通知。
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
System.out.println("endElement");
}
//接收文件結束的通知。
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("文件結束");
}
}
3、xmlpull解析的實現
原理:類似sax 一邊解析 一邊處理 它是Android內建的解析器
//程式碼的實現
[1]匯入xmlpullparser相關的jar包
[2]具體的程式碼實現
//[0]建立一個集合
List<Book> lists = null;
Book book = null;
//[1]構建工廠
XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
//[2]通過工廠獲取 xmlpullparser解析器
XmlPullParser parser = xmlPullParserFactory.newPullParser();
//[3]開始解析xml arg1編碼的方式
parser.setInput(new FileInputStream("bookstore.xml"), "utf-8");
//[4]獲取解析的事件型別
int eventType = parser.getEventType(); //代表解析到了文件的開頭
//[5]不到檔案的結尾就一直解析
while(eventType!=XmlPullParser.END_DOCUMENT){
switch (eventType) {
case XmlPullParser.START_TAG: //代表解析的開始標籤
//[6]具體判斷一下解析到了哪個開始標籤
if("bookstore".equals(parser.getName())){
//[7]建立list集合
lists= new ArrayList<Book>();
}else if("book".equals(parser.getName())){
//[8]建立javabean物件
book = new Book();
//[9]獲取id的屬性 getAttributeValue 獲取開始標籤的一個屬性值
String id = parser.getAttributeValue(0);
book.setId(id);
}else if("name".equals(parser.getName())){
//pull解析注意獲取標籤包裹的內容則是 使用 .NextText()
//而不是使用getText();
String name = parser.nextText();
book.setName(name);
}else if("price".equals(parser.getName())){
String price = parser.nextText();
book.setPrice(price);
}
break;
case XmlPullParser.END_TAG: //代表解析的結束的標籤
if("book".equals(parser.getName())){
//把book物件加入到list集合中
lists.add(book);
}
break;
}
//獲取下一個標籤的型別
eventType = parser.next();
//[6]一直解析
}
//最後一步 列印一下集合的資訊
for (Book l : lists) {
System.out.println("l~~~"+l);
}