搜尋

XML SAX解析詳解

Apr 04, 2017 am 10:57 AM



DOM和SAX的最終功能是可以讓我們利用java JavaScript等語言來取得xml檔案中的節點及文字、屬性等資訊。

本文引自其他博客,內容易懂,為了節省時間,直接摘抄過來了。   JAVA 解析 XML 通常有兩種方式,DOM 和 SAX。 DOM 雖然是W3C 的標準,提供了標準的解析方式,但它的解析效率一直不盡如人意,因為使用DOM解析XML時,解析器讀入整個文檔並構建一個駐留內存的樹結構(節點樹),然後您的程式碼才可以使用DOM 的標準介面來操作這個樹結構。但大部分情況下我們只對文檔的部分內容感興趣,根本就不用先解析整個文檔,並且從節點樹的根節點來索引一些我們需要的資料也是非常耗時的。

SAX是一種XML解析的替代方法。相較於文檔物件模型DOM,SAX 是讀取和操作 XML 資料的更快速、更輕的方


法。 SAX 允許您在讀取文件時處理它,而不必等待整個文件儲存後才採取操作。它不涉及 DOM 所必需的開銷和概念跳躍。 SAX API是一個基於事件的API ,適用於處理資料流,即隨著資料的流動而依序處理資料。 SAX API


在其解析您的文件時發生一定事件的時候會通知您。當您對其回應時,您不作保存的資料將會 被拋棄。


下面是SAX解析XML的範例(有點長,因為詳細註解了SAX事件處理的所有方法),SAX API中主要有四種處理事件的接口,它們分別是ContentHandler,DTDHandler, EntityResolver 和ErrorHandler 。下面的例子可能有點冗長,實際上只要繼承DefaultHandler 類別 ,再覆蓋一部分 處理事件的方法 同樣可以達到這個範例的效果,但為了縱觀全局,還是看看SAX API裡面所有主要的事件解析方法吧。 ( 實際上DefaultHandler就是實作了上面的四個事件處理器接口,然後提供了每個抽象方法的預設實作。)


##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();

#}

/*

* 接收字元資料的通知。

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

*/

@Override

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

StringBuffer buffer = new StringBuffer();

for(int i = begin ; 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");

}



/*

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

* 參數意義如下:

*    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);

}


/*

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

* 參數意義如下:

*     ch : 來自XML 文件的字元

*     start : 陣列中的開始位置

*     length : 從陣列中的開始位置

*     length : 從陣列中的開始位置

*     length : 從陣列中讀取的字元的數目

*/

@Override

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

throws SAXException {

StringBuffer buffer = new StringBuffer();

for(int i = begin ; 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());


}

/*

##* 接收處理指令的通知。

* 參數意義如下:

*     target : 處理指令目標

*     data : 處理指令數據,若未提供,則為 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 文件事件起源的物件。

* 參數意義如下:

*     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()+")");

#}

##/*

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

* 參數意義如下:

*     name : 所跳過的實體的名稱。如果它是參數實體,則名稱將以 '%' 開頭,###

*            如果它是外部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 ");

#}


##/*

*接收元素開始的通知。

* 參數意義如下:

*    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 名稱空間範圍映射。

* 此事件的資訊對於常規的命名空間處理並非必要:

* 當http://xml.org/sax/features/namespaces 功能為true(預設)時,

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

* 參數意義如下:

*    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 相關的事件的通知的處理器介面。 ######import org.xml.sax.SAXException;################public class MyDTDHandler implements DTDHandler {################ #/*######* 接收註解宣告事件的通知。的公共標識符,如果未提供,則為null。 ######*     systemId - 註釋的系統標識符,如果未提供,則為 null。 ######*/######@Override######public void notationDecl(String name, String publicId, String systemId)######throws SAXException {####### System.out.println(">>> notation declare : (name = "+name######+",systemId = "+publicId######+",publicId = "+systemId+ ")");######}###############/*######* 接收未解析的實體宣告事件的通知。 ######* 參數意義如下:######*     name - 未解析的實體的名稱。 ######*     publicId - 實體的公共識別符,如果未提供,則為 null。 ######*     systemId - 實體的系統識別碼。 ######*     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 {# ##############/*######* 允許應用程式解析外部實體。 ######* 解析器會在開啟任何外部實體(頂層文件實體除外)之前呼叫此方法######* 參數意義如下:######*     publicId : 被引用的外部實體的公共標識符,如果未提供,則為null。 ######*     systemId : 被引用的外部實體的系統識別碼。 ###

* 傳回:

*     一個描述新輸入來源的 InputSource 對象,或傳回 null,

*     以請求解析器開啟到系統識別碼的常規 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 {

#//建立處理文件內容相關事件的處理器

ContentHandler contentHandler = new MyContentHandler();

//建立處理錯誤事件處理器

ErrorHandler errorHandler = new MyErrorHandler();

//建立處理DTD相關事件的處理器

DTDHandler dtdHandler = new MyDTDHandler();

#//建立實體解析器

EntityResolver entityResolver = new MyEntityResolver();


//建立一個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

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###

>>>字元(2): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\n\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\t

>>>>起始元素:book(http://test.org/books)

>>字元(3): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\n\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\t\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\t

>>>>起始元素:名稱(http://test.org/books)

>>字符(16):JAVA思維

>>結束元素:名稱(http://test.org/books)

>>字元(2): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\n\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\t

>>>>結束元素:book(http://test.org/books)

>>字元(2): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\n\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\t

>>>>起始元素:book(http://test.org/books)

>>字元(3): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\n\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\t\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\t

>>>>起始元素:名稱(http://test.org/books)

>>字元(10):核心JAVA2

>>結束元素:名稱(http://test.org/books)

>>字元(2): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\n\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\t

>>>>結束元素:book(http://test.org/books)

>>字元(2): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\n\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\t

>>>>起始元素:book(http://test.org/books)

>>字元(3): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\n\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\t\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\t

>>>>起始元素:名稱(http://test.org/books)

>>字元(10):C++ 入門

>>>>結束元素:名稱(http://test.org/books)

>>字元(2): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\\\\\\\\\\\\n\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\t

>>>>結束元素:book(http://test.org/books)

>>字元(1): \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\n

>>>>結束元素:書籍(http://test.org/books)

>>結束前綴映射:

>>結束文檔

以上是XML SAX解析詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
創建RSS文檔:逐步教程創建RSS文檔:逐步教程Apr 13, 2025 am 12:10 AM

創建RSS文檔的步驟如下:1.使用XML格式編寫,根元素為,包含元素。 2.在內添加、、等元素描述頻道信息。 3.添加元素,每個代表一個內容條目,包含、、、等。 4.可選地添加和元素,豐富內容。 5.確保XML格式正確,使用在線工具驗證,優化性能並保持內容更新。

XML在RSS中的作用:聯合內容的基礎XML在RSS中的作用:聯合內容的基礎Apr 12, 2025 am 12:17 AM

XML在RSS中的核心作用是提供一種標準化和靈活的數據格式。 1.XML的結構和標記語言特性使其適合數據交換和存儲。 2.RSS利用XML創建標準化格式,方便內容共享。 3.XML在RSS中的應用包括定義feed內容的元素,如標題和發布日期。 4.優勢包括標準化和可擴展性,挑戰包括文件冗長和嚴格語法要求。 5.最佳實踐包括驗證XML有效性、保持簡潔、使用CDATA和定期更新。

從XML到可讀的內容:揭開RSS feed的神秘面紗從XML到可讀的內容:揭開RSS feed的神秘面紗Apr 11, 2025 am 12:03 AM

rssfeedsarexmldocuments usedforcontentAggregation and distribution.totransformthemintoreadableContent:1)parsethethexmlusinglibrarieslibrariesliblarieslikeparserinparserinpython.2)andledifferentifferentrssssssssssssssssssssssssssssssssssssssssssssssersions andpotentionparsingrorS.3)

是否有基於JSON的RSS替代方案?是否有基於JSON的RSS替代方案?Apr 10, 2025 am 09:31 AM

JSONFeed是一種基於JSON的RSS替代方案,其優勢在於簡潔性和易用性。 1)JSONFeed使用JSON格式,易於生成和解析。 2)它支持動態生成,適用於現代Web開發。 3)使用JSONFeed可以提升內容管理效率和用戶體驗。

RSS文檔工具:構建,驗證和發布提要RSS文檔工具:構建,驗證和發布提要Apr 09, 2025 am 12:10 AM

如何構建、驗證和發布RSSfeeds? 1.構建:使用Python腳本生成RSSfeed,包含標題、鏈接、描述和發布日期。 2.驗證:使用FeedValidator.org或Python腳本檢查RSSfeed是否符合RSS2.0標準。 3.發布:將RSS文件上傳到服務器,或使用Flask動態生成並發布RSSfeed。通過這些步驟,你可以有效管理和分享內容。

確保您的XML/RSS提要:全面的安全清單確保您的XML/RSS提要:全面的安全清單Apr 08, 2025 am 12:06 AM

確保XML/RSSfeeds安全性的方法包括:1.數據驗證,2.加密傳輸,3.訪問控制,4.日誌和監控。這些措施通過網絡安全協議、數據加密算法和訪問控制機制來保護數據的完整性和機密性。

XML/RSS面試問題和答案:提高您的專業知識XML/RSS面試問題和答案:提高您的專業知識Apr 07, 2025 am 12:19 AM

XML是一種標記語言,用於存儲和傳輸數據,RSS是一種基於XML的格式,用於發布頻繁更新的內容。 1)XML通過標籤和屬性描述數據結構,2)RSS定義特定標籤發布和訂閱內容,3)使用Python的xml.etree.ElementTree模塊可以創建和解析XML,4)XPath表達式可查詢XML節點,5)feedparser庫可解析RSSfeed,6)常見錯誤包括標籤不匹配和編碼問題,可用xmllint驗證,7)使用SAX解析器處理大型XML文件可優化性能。

高級XML/RSS教程:ACE您的下一次技術採訪高級XML/RSS教程:ACE您的下一次技術採訪Apr 06, 2025 am 12:12 AM

XML是一種用於數據存儲和交換的標記語言,RSS是基於XML的格式,用於發布更新內容。 1.XML定義數據結構,適合數據交換和存儲。 2.RSS用於內容訂閱,解析時使用專門庫。 3.解析XML可使用DOM或SAX,生成XML和RSS需正確設置元素和屬性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器