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就是實作了上面的四個事件處理器接口,然後提供了每個抽象方法的預設實作。)
##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 範圍的對應。 */@Overridepublic void endPrefixMapping(String prefix) throws SAXException {System.out.println(this.toBlankString(-- this.frontBlankCount)+">>> end prefix_mapping : "+prefix);}}}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()+")");
#}
* 如果它是外部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 ");
#}
# ">>> start prefix_mapping : xmlns:"+prefix+" = "
+"\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\""+uri+"\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\"");
}#}'
* 傳回:
* 一個描述新輸入來源的 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());
##}##}
#}
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")));}
#}'
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中文網其他相關文章!

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

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

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

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

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

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

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SublimeText3漢化版
中文版,非常好用

WebStorm Mac版
好用的JavaScript開發工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器