XML SAX解析詳解

新增鏈接http://m.blog.csdn.net/article/details?id=7305068,這一篇更加實用躯泰,不過概念偏少谭羔。


DOM和SAX的最終作用是可以讓我們利用java JavaScript等語言來獲取xml文件中的節(jié)點及文本、屬性等信息麦向。

本文引自其他博客瘟裸,內容易懂,為了節(jié)省時間诵竭,直接摘抄過來了话告。

http://yangjunfeng.iteye.com/blog/401377


? JAVA 解析 XML 通常有兩種方式,DOM 和 SAX卵慰。DOM 雖然是 W3C 的標準沙郭,提供了標準的解析方式,但它的解析效率一直不盡如人意裳朋,因為使用DOM解析XML時病线,解析器讀入整個文檔并構建一個駐留內存的樹結構(節(jié)點樹),然后您的代碼才可以使用 DOM 的標準接口來操作這個樹結構。但大部分情況下我們只對文檔的部分內容感興趣送挑,根本就不用先解析整個文檔绑莺,并且從節(jié)點樹的根節(jié)點來索引一些我們需要的數(shù)據(jù)也是非常耗時的。

SAX是一種XML解析的替代方法惕耕。相比于文檔對象模型DOM纺裁,SAX 是讀取和操作 XML 數(shù)據(jù)的更快速、更輕量的方


法赡突。SAX 允許您在讀取文檔時處理它对扶,從而不必等待整個文檔被存儲之后才采取操作。它不涉及 DOM 所必需的開銷和概念跳躍惭缰。 SAX API是一個基于事件的API 浪南,適用于處理數(shù)據(jù)流,即隨著數(shù)據(jù)的流動而依次處理數(shù)據(jù)漱受。SAX API


在其解析您的文檔時發(fā)生一定事件的時候會通知您络凿。在您對其響應時,您不作保存的數(shù)據(jù)將會 被拋棄昂羡。


下面是一個SAX解析XML的示例(有點長絮记,因為詳細注解了SAX事件處理的所有方法),SAX API中主要有四種處理事件的接口虐先,它們分別是ContentHandler怨愤,DTDHandler, EntityResolver 和 ErrorHandler 蛹批。下面的例子可能有點冗長撰洗,實際上只要繼承DefaultHandler 類 ,再覆蓋一部分 處理事件的方法 同樣可以達到這個示例的效果腐芍,但為了縱觀全局差导,還是看看SAX API里面所有主要的事件解析方法吧。( 實際上DefaultHandler就是實現(xiàn)了上面的四個事件處理器接口猪勇,然后提供了每個抽象方法的默認實現(xiàn)设褐。)


1,ContentHandler 接口 :接收文檔邏輯內容的通知 的處理器接口泣刹。

Java代碼 ?收藏代碼

'import org.xml.sax.Attributes;

import org.xml.sax.ContentHandler;

import org.xml.sax.Locator;

import org.xml.sax.SAXException;


class MyContentHandler implements ContentHandler{

StringBuffer jsonStringBuffer ;

int frontBlankCount = 0;

public MyContentHandler(){

jsonStringBuffer = new StringBuffer();

}

/*

* 接收字符數(shù)據(jù)的通知助析。

* 在DOM中 ch[begin:end] 相當于Text節(jié)點的節(jié)點值(nodeValue)

*/

@Override

public void characters(char[] ch, int begin, int length) throws SAXException {

StringBuffer buffer = new StringBuffer();

for(int i = begin ; i < begin+length ; i++){

switch(ch[i]){

case '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\':buffer.append("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\");break;

case '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\r':buffer.append("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\r");break;

case '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n':buffer.append("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n");break;

case '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\t':buffer.append("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\t");break;

case '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"':buffer.append("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"");break;

default : buffer.append(ch[i]);

}

}

System.out.println(this.toBlankString(this.frontBlankCount)+

">>> characters("+length+"): "+buffer.toString());

}



/*

* 接收文檔的結尾的通知。

*/

@Override

public void endDocument() throws SAXException {

System.out.println(this.toBlankString(--this.frontBlankCount)+

">>> end document");

}



/*

* 接收文檔的結尾的通知椅您。

* 參數(shù)意義如下:

* ? ?uri :元素的命名空間

* ? ?localName :元素的本地名稱(不帶前綴)

* ? ?qName :元素的限定名(帶前綴)

*

*/

@Override

public void endElement(String uri,String localName,String qName)

throws SAXException {

System.out.println(this.toBlankString(--this.frontBlankCount)+

">>> end element : "+qName+"("+uri+")");

}


/*

* 結束前綴 URI 范圍的映射外冀。

*/

@Override

public void endPrefixMapping(String prefix) throws SAXException {

System.out.println(this.toBlankString(--this.frontBlankCount)+

">>> end prefix_mapping : "+prefix);

}


/*

* 接收元素內容中可忽略的空白的通知。

* 參數(shù)意義如下:

* ? ? ch : 來自 XML 文檔的字符

* ? ? start : 數(shù)組中的開始位置

* ? ? length : 從數(shù)組中讀取的字符的個數(shù)

*/

@Override

public void ignorableWhitespace(char[] ch, int begin, int length)

throws SAXException {

StringBuffer buffer = new StringBuffer();

for(int i = begin ; i < begin+length ; i++){

switch(ch[i]){

case '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\':buffer.append("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\");break;

case '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\r':buffer.append("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\r");break;

case '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n':buffer.append("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n");break;

case '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\t':buffer.append("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\t");break;

case '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"':buffer.append("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"");break;

default : buffer.append(ch[i]);

}

}

System.out.println(this.toBlankString(this.frontBlankCount)+">>> ignorable whitespace("+length+"): "+buffer.toString());

}


/*

* 接收處理指令的通知襟沮。

* 參數(shù)意義如下:

* ? ? target : 處理指令目標

* ? ? data : 處理指令數(shù)據(jù),如果未提供,則為 null开伏。

*/

@Override

public void processingInstruction(String target,String data)

throws SAXException {

System.out.println(this.toBlankString(this.frontBlankCount)+">>> process instruction : (target = \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\""

+target+"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\",data = \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\""+data+"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\")");

}


/*

* 接收用來查找 SAX 文檔事件起源的對象膀跌。

* 參數(shù)意義如下:

* ? ? locator : 可以返回任何 SAX 文檔事件位置的對象

*/

@Override

public void setDocumentLocator(Locator locator) {

System.out.println(this.toBlankString(this.frontBlankCount)+

">>> set document_locator : (lineNumber = "+locator.getLineNumber()

+",columnNumber = "+locator.getColumnNumber()

+",systemId = "+locator.getSystemId()

+",publicId = "+locator.getPublicId()+")");


}


/*

* 接收跳過的實體的通知。

* 參數(shù)意義如下:

* ? ? name : 所跳過的實體的名稱固灵。如果它是參數(shù)實體捅伤,則名稱將以 '%' 開頭,

* ? ? ? ? ? ?如果它是外部 DTD 子集巫玻,則將是字符串 "[dtd]"

*/

@Override

public void skippedEntity(String name) throws SAXException {

System.out.println(this.toBlankString(this.frontBlankCount)+

">>> skipped_entity : "+name);

}


/*

* 接收文檔的開始的通知丛忆。

*/

@Override

public void startDocument() throws SAXException {

System.out.println(this.toBlankString(this.frontBlankCount++)+

">>> start document ");

}


/*

* 接收元素開始的通知。

* 參數(shù)意義如下:

* ? ?uri :元素的命名空間

* ? ?localName :元素的本地名稱(不帶前綴)

* ? ?qName :元素的限定名(帶前綴)

* ? ?atts :元素的屬性集合

*/

@Override

public void startElement(String uri, String localName, String qName,

Attributes atts) throws SAXException {

System.out.println(this.toBlankString(this.frontBlankCount++)+

">>> start element : "+qName+"("+uri+")");

}


/*

* 開始前綴 URI 名稱空間范圍映射仍秤。

* 此事件的信息對于常規(guī)的命名空間處理并非必需:

* 當 http://xml.org/sax/features/namespaces 功能為 true(默認)時熄诡,

* SAX XML 讀取器將自動替換元素和屬性名稱的前綴。

* 參數(shù)意義如下:

* ? ?prefix :前綴

* ? ?uri :命名空間

*/

@Override

public void startPrefixMapping(String prefix,String uri)

throws SAXException {

System.out.println(this.toBlankString(this.frontBlankCount++)+

">>> start prefix_mapping : xmlns:"+prefix+" = "

+"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\""+uri+"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"");


}


private String toBlankString(int count){

StringBuffer buffer = new StringBuffer();

for(int i = 0;i

buffer.append(" ? ?");

return buffer.toString();

}


}'



2诗力,DTDHandler 接口 :接收與 DTD 相關的事件的通知的處理器接口凰浮。

Java代碼 ?收藏代碼

'import org.xml.sax.DTDHandler;

import org.xml.sax.SAXException;


public class MyDTDHandler implements DTDHandler {


/*

* 接收注釋聲明事件的通知。

* 參數(shù)意義如下:

* ? ? name - 注釋名稱苇本。

* ? ? publicId - 注釋的公共標識符袜茧,如果未提供,則為 null瓣窄。

* ? ? systemId - 注釋的系統(tǒng)標識符笛厦,如果未提供,則為 null俺夕。

*/

@Override

public void notationDecl(String name, String publicId, String systemId)

throws SAXException {

System.out.println(">>> notation declare : (name = "+name

+",systemId = "+publicId

+",publicId = "+systemId+")");

}


/*

* 接收未解析的實體聲明事件的通知裳凸。

* 參數(shù)意義如下:

* ? ? name - 未解析的實體的名稱。

* ? ? publicId - 實體的公共標識符啥么,如果未提供登舞,則為 null。

* ? ? systemId - 實體的系統(tǒng)標識符悬荣。

* ? ? notationName - 相關注釋的名稱菠秒。

*/

@Override

public void unparsedEntityDecl(String name,

String publicId,

String systemId,

String notationName) throws SAXException {

System.out.println(">>> unparsed entity declare : (name = "+name

+",systemId = "+publicId

+",publicId = "+systemId

+",notationName = "+notationName+")");

}


}'



3,EntityResolver 接口 :是用于解析實體的基本接口氯迂。

Java代碼 ?收藏代碼

'import java.io.IOException;


import org.xml.sax.EntityResolver;

import org.xml.sax.InputSource;

import org.xml.sax.SAXException;


public class MyEntityResolver implements EntityResolver {


/*

* 允許應用程序解析外部實體践叠。

* 解析器將在打開任何外部實體(頂級文檔實體除外)前調用此方法

* 參數(shù)意義如下:

* ? ? publicId : 被引用的外部實體的公共標識符,如果未提供嚼蚀,則為 null禁灼。

* ? ? systemId : 被引用的外部實體的系統(tǒng)標識符。

* 返回:

* ? ? 一個描述新輸入源的 InputSource 對象轿曙,或者返回 null弄捕,

* ? ? 以請求解析器打開到系統(tǒng)標識符的常規(guī) URI 連接僻孝。

*/

@Override

public InputSource resolveEntity(String publicId, String systemId)

throws SAXException, IOException {

return null;

}


}


4,ErrorHandler接口 :是錯誤處理程序的基本接口守谓。

Java代碼 ?收藏代碼

import org.xml.sax.ErrorHandler;

import org.xml.sax.SAXException;

import org.xml.sax.SAXParseException;


public class MyErrorHandler implements ErrorHandler {


/*

* 接收可恢復的錯誤的通知

*/

@Override

public void error(SAXParseException e) throws SAXException {

System.err.println("Error ("+e.getLineNumber()+","

+e.getColumnNumber()+") : "+e.getMessage());

}


/*

* 接收不可恢復的錯誤的通知穿铆。

*/

@Override

public void fatalError(SAXParseException e) throws SAXException {

System.err.println("FatalError ("+e.getLineNumber()+","

+e.getColumnNumber()+") : "+e.getMessage());

}


/*

* 接收不可恢復的錯誤的通知。

*/

@Override

public void warning(SAXParseException e) throws SAXException {

System.err.println("Warning ("+e.getLineNumber()+","

+e.getColumnNumber()+") : "+e.getMessage());

}


}



Test 類的主方法打印解析books.xml時的事件信息斋荞。

Java代碼 ?收藏代碼

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;


import org.xml.sax.ContentHandler;

import org.xml.sax.DTDHandler;

import org.xml.sax.EntityResolver;

import org.xml.sax.ErrorHandler;

import org.xml.sax.InputSource;

import org.xml.sax.SAXException;

import org.xml.sax.XMLReader;

import org.xml.sax.helpers.XMLReaderFactory;



public class Test {


public static void main(String[] args) throws SAXException,

FileNotFoundException, IOException {

//創(chuàng)建處理文檔內容相關事件的處理器

ContentHandler contentHandler = new MyContentHandler();

//創(chuàng)建處理錯誤事件處理器

ErrorHandler errorHandler = new MyErrorHandler();

//創(chuàng)建處理DTD相關事件的處理器

DTDHandler dtdHandler = new MyDTDHandler();

//創(chuàng)建實體解析器

EntityResolver entityResolver = new MyEntityResolver();


//創(chuàng)建一個XML解析器(通過SAX方式讀取解析XML)

XMLReader reader = XMLReaderFactory.createXMLReader();

/*

* 設置解析器的相關特性

* ? ? http://xml.org/sax/features/validation = true 表示開啟驗證特性

* ? ? http://xml.org/sax/features/namespaces = true 表示開啟命名空間特性

*/

reader.setFeature("http://xml.org/sax/features/validation",true);

reader.setFeature("http://xml.org/sax/features/namespaces",true);

//設置XML解析器的處理文檔內容相關事件的處理器

reader.setContentHandler(contentHandler);

//設置XML解析器的處理錯誤事件處理器

reader.setErrorHandler(errorHandler);

//設置XML解析器的處理DTD相關事件的處理器

reader.setDTDHandler(dtdHandler);

//設置XML解析器的實體解析器

reader.setEntityResolver(entityResolver);

//解析books.xml文檔

reader.parse(new InputSource(new FileReader("books.xml")));

}


}'



books.xml 文件的內容如下:


Xml代碼 ?收藏代碼







Thinking in JAVA




Core JAVA2




C++ primer




控制臺輸出如下:


>>> set document_locator : (lineNumber = 1,columnNumber = 1,systemId = null,publicId = null)

>>> start document

Error (2,7) : Document is invalid: no grammar found.

Error (2,7) : Document root element "books", must match DOCTYPE root "null".

>>> start prefix_mapping : xmlns: = "http://test.org/books"

>>> start element : books(http://test.org/books)

>>> characters(2): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\t

>>> characters(2): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\t

>>> start element : book(http://test.org/books)

>>> characters(3): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\t\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\t

>>> start element : name(http://test.org/books)

>>> characters(16): Thinking in JAVA

>>> end element : name(http://test.org/books)

>>> characters(2): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\t

>>> end element : book(http://test.org/books)

>>> characters(2): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\t

>>> start element : book(http://test.org/books)

>>> characters(3): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\t\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\t

>>> start element : name(http://test.org/books)

>>> characters(10): Core JAVA2

>>> end element : name(http://test.org/books)

>>> characters(2): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\t

>>> end element : book(http://test.org/books)

>>> characters(2): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\t

>>> start element : book(http://test.org/books)

>>> characters(3): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\t\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\t

>>> start element : name(http://test.org/books)

>>> characters(10): C++ primer

>>> end element : name(http://test.org/books)

>>> characters(2): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\t

>>> end element : book(http://test.org/books)

>>> characters(1): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n

>>> end element : books(http://test.org/books)

>>> end prefix_mapping :

>>> end document ?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末荞雏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子平酿,更是在濱河造成了極大的恐慌凤优,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜈彼,死亡現(xiàn)場離奇詭異筑辨,居然都是意外死亡,警方通過查閱死者的電腦和手機柳刮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門挖垛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秉颗,你說我怎么就攤上這事痢毒。” “怎么了蚕甥?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵哪替,是天一觀的道長。 經常有香客問我菇怀,道長凭舶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任爱沟,我火速辦了婚禮帅霜,結果婚禮上,老公的妹妹穿的比我還像新娘呼伸。我一直安慰自己身冀,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布括享。 她就那樣靜靜地躺著搂根,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铃辖。 梳的紋絲不亂的頭發(fā)上剩愧,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音娇斩,去河邊找鬼仁卷。 笑死穴翩,一個胖子當著我的面吹牛,可吹牛的內容都是我干的锦积。 我是一名探鬼主播藏否,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼充包!你這毒婦竟也來了?” 一聲冷哼從身側響起遥椿,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤基矮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后冠场,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體家浇,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年碴裙,在試婚紗的時候發(fā)現(xiàn)自己被綠了钢悲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡舔株,死狀恐怖莺琳,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情载慈,我是刑警寧澤惭等,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站办铡,受9級特大地震影響辞做,放射性物質發(fā)生泄漏。R本人自食惡果不足惜寡具,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一秤茅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧童叠,春花似錦框喳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至粪般,卻和暖如春拼余,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亩歹。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工匙监, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凡橱,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓亭姥,卻偏偏與公主長得像稼钩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子达罗,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理坝撑,服務發(fā)現(xiàn),斷路器粮揉,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法巡李,類相關的語法,內部類的語法扶认,繼承相關的語法侨拦,異常的語法,線程的語...
    子非魚_t_閱讀 31,587評論 18 399
  • 1 XML解析No29 【 XML:可拓展標記語言辐宾,語言和HTML類似狱从,也是一種標記語言。 特點:標記是自定義...
    征程_Journey閱讀 1,626評論 0 9
  • 一. Java基礎部分.................................................
    wy_sure閱讀 3,795評論 0 11
  • 主觀的我叠纹,拗不過悲觀的客 就像慢行的船季研,抵不過急流的河 葉隨風飄落,云隨風閃躲 思想抵不過相思誉察,情讓一切不可捉摸
    怡馨宅閱讀 238評論 1 5