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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

XML——流机制解析器

發(fā)布時(shí)間:2023/12/3 asp.net 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 XML——流机制解析器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【0】README

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


【1】XML——流機(jī)制解析器概述

1)problem+solution

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

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


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

1)SAX解析器在解析XML 輸入的組成部分時(shí)會(huì)報(bào)告事件, 但不會(huì)以任何方式存儲(chǔ)文檔,而是由事件處理器建立相應(yīng)的數(shù)據(jù)結(jié)構(gòu); (干貨——SAX解析器在解析XML 輸入的組成部分時(shí)會(huì)報(bào)告事件,即SAX解析器是基于事件的)
2)在使用SAX 解析器時(shí),需要一個(gè)處理器來為不同的解析器事件定義事件動(dòng)作,ContentHandler接口定義了若干個(gè)在解析文檔時(shí)解析器會(huì)調(diào)用的回調(diào)方法。 下面是最重要的幾個(gè):

  • 2.1)startElement 和 endElement: 在每當(dāng)遇到起始或終止標(biāo)簽時(shí)調(diào)用;
  • 2.2)characters :在每當(dāng)遇到字符數(shù)據(jù)事件調(diào)用;
  • 2.3)startDocument 和 endDocument:分別在文檔開始和結(jié)束時(shí)各調(diào)用一次;

3)看個(gè)荔枝:解析以下片段時(shí),

<font><name>a</name><size units="pt">36</size> </font>
  • 3.1)解析器會(huì)產(chǎn)生以下調(diào)用:

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

Attention)

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

4)代碼分析:

  • 4.1)下面是如何得到SAX 解析器的代碼: (干貨——如何創(chuàng)建SAX解析器)
SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser();
  • 4.2)現(xiàn)在可以處理文檔了:
InputStream in = new URL(url).openStream();saxParser.parse(in, handler);
  • 4.3)這里的source 可以是一個(gè)文件, 一個(gè)URL 字符串或者是一個(gè)輸入流。Handler 屬于 DefaultHandler 的一個(gè)子類, DefaultHandler 類為以下四個(gè)接口定義了空的方法:
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個(gè)描述元素名的參數(shù): 其中 qname 參數(shù)以 prefix:localname的形式報(bào)告限定名; 如果命名空間處理特性已經(jīng)打開, 那么 namespaceURI 和 lname 參數(shù)描述的就是 命名空間和 本地名(非限定)。
  • 4.5)與DOM解析器一樣, 命名空間處理特性默認(rèn)是關(guān)閉 的, 可以調(diào)用工廠類的 setNamespaceAware 方法來激活命名空間處理特性:
SAXParserFactory factory = SAXParserFactory.newInstance();factory.setNamespaceAware(true);SAXParser saxParser = factory.newSAXParser();
  • 4.6)我們還處理了另外一個(gè)常見的問題: (干貨——如果你不需要驗(yàn)證文件, 只需調(diào)用factory.setFeature方法)
    • XHTML 文件總是以一個(gè)包含對(duì) DTD 引用的標(biāo)簽開頭, 解析器將加載這個(gè) DTD。 可以理解的是, W3C 肯定不樂意對(duì)諸如www.w3.org/TR/xhtml/DTD/xhtml-strict.dtd 這樣的文件提供千萬億次的下載。總有一天,他們會(huì)完全拒絕提供這些文件, 至今,它們還在并不情愿地提供DTD下載。如果你不需要驗(yàn)證文件, 只需調(diào)用: factory.setFeature(“http://apache.org/xml/features/nonvalidating/load-external-dtd“, false);

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。