日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

XML——流机制解析器

發布時間:2023/12/3 asp.net 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 XML——流机制解析器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【0】README

0.1) 本文文字描述轉自 core java volume 2 , 旨在理解 XML——流機制解析器 的基礎知識 ;
0.2) for detailed StAX, please visit http://blog.csdn.net/pacosonswjtu/article/details/50569728


【1】XML——流機制解析器概述

1)problem+solution

  • 1.1)problem: 如果文檔很大,并且處理算法簡單,可以在運行時解析節點, 而不必看到完整的樹型結構, 那么DOM 解析器的執行效率就低下 了;
  • 1.2)solution: 在這種case 下, 我們應該使用流機制解析器;(干貨——引入流機制解析器的原因)

2)java 提供的流機制解析器: SAX解析器和添加到Java 6 中的更現代化的 StAX 解析器。 SAX解析器使用的是事件回調, 而StAX解析器提供了解析事件的迭代器;(干貨——java提供了SAX流機制解析器+StAX 解析器)


【2】使用SAX解析器 (干貨——DOM解析器是基于SAX解析器的)

1)SAX解析器在解析XML 輸入的組成部分時會報告事件, 但不會以任何方式存儲文檔,而是由事件處理器建立相應的數據結構; (干貨——SAX解析器在解析XML 輸入的組成部分時會報告事件,即SAX解析器是基于事件的)
2)在使用SAX 解析器時,需要一個處理器來為不同的解析器事件定義事件動作,ContentHandler接口定義了若干個在解析文檔時解析器會調用的回調方法。 下面是最重要的幾個:

  • 2.1)startElement 和 endElement: 在每當遇到起始或終止標簽時調用;
  • 2.2)characters :在每當遇到字符數據事件調用;
  • 2.3)startDocument 和 endDocument:分別在文檔開始和結束時各調用一次;

3)看個荔枝:解析以下片段時,

<font><name>a</name><size units="pt">36</size> </font>
  • 3.1)解析器會產生以下調用:

    • step1)startElement, 元素名: font
    • step2)startElement, 元素名: name
    • step3)characters, 內容: a
    • step4)endElement, 元素名: name
    • step5)startElement, 元素名:size,屬性:units=“pt”
    • step6)characters, 內容: 36
    • step7)endElement, 元素名: size
    • step8)endElement, 元素名: font
  • 3.2)處理器必須覆蓋以上方法, 讓它們執行在解析文件時想要執行的動作;

Attention)

  • A1) HTML不是合法的XML, 大多數 HTML 頁面都與良構的XML差別很大, 以至于示例程序無法解析它們;
  • A2)但是,W3C 編寫的大部分頁面都是用 XHTML編寫的, XHTML 是一種 HTML方言,又是良構的XML; (干貨——HTML不是合法的XML,而 XHTML 是一種 HTML方言,又是良構的XML)

4)代碼分析:

  • 4.1)下面是如何得到SAX 解析器的代碼: (干貨——如何創建SAX解析器)
SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser();
  • 4.2)現在可以處理文檔了:
InputStream in = new URL(url).openStream();saxParser.parse(in, handler);
  • 4.3)這里的source 可以是一個文件, 一個URL 字符串或者是一個輸入流。Handler 屬于 DefaultHandler 的一個子類, DefaultHandler 類為以下四個接口定義了空的方法:
DefaultHandler handler = new DefaultHandler(){public void startElement(String namespaceURI, String lname, String qname,Attributes attrs){if (lname.equals("a") && attrs != null){for (int i = 0; i < attrs.getLength(); i++){String aname = attrs.getLocalName(i);if (aname.equals("href")) System.out.println(attrs.getValue(i));}}}};
  • 4.4)startElement 方法有3個描述元素名的參數: 其中 qname 參數以 prefix:localname的形式報告限定名; 如果命名空間處理特性已經打開, 那么 namespaceURI 和 lname 參數描述的就是 命名空間和 本地名(非限定)。
  • 4.5)與DOM解析器一樣, 命名空間處理特性默認是關閉 的, 可以調用工廠類的 setNamespaceAware 方法來激活命名空間處理特性:
SAXParserFactory factory = SAXParserFactory.newInstance();factory.setNamespaceAware(true);SAXParser saxParser = factory.newSAXParser();
  • 4.6)我們還處理了另外一個常見的問題: (干貨——如果你不需要驗證文件, 只需調用factory.setFeature方法)
    • XHTML 文件總是以一個包含對 DTD 引用的標簽開頭, 解析器將加載這個 DTD。 可以理解的是, W3C 肯定不樂意對諸如www.w3.org/TR/xhtml/DTD/xhtml-strict.dtd 這樣的文件提供千萬億次的下載??傆幸惶?#xff0c;他們會完全拒絕提供這些文件, 至今,它們還在并不情愿地提供DTD下載。如果你不需要驗證文件, 只需調用: factory.setFeature(“http://apache.org/xml/features/nonvalidating/load-external-dtd“, false);

總結

以上是生活随笔為你收集整理的XML——流机制解析器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。