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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

SAX解析xml (遍历DOM树各节点)

發布時間:2025/7/14 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SAX解析xml (遍历DOM树各节点) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文參考?http://yangjunfeng.iteye.com/blog/401377

?

1. books.xml

1 <?xml version="1.0" encoding="UTF-8"?> 2 <bk:books count="3" xmlns:bk="http://test.org/books"> 3 <!--books's comment --> 4 <bk:book id="1"> 5 <bk:name>Thinking in JAVA</bk:name> 6 </bk:book> 7 <bk:book id="2"> 8 <bk:name>Core JAVA2</bk:name> 9 </bk:book> 10 <bk:book id="3"> 11 <bk:name>C++ primer</bk:name> 12 <addr:address xmlns:addr="http://test.org/address"> 13 <addr:state>China</addr:state> 14 <addr:city>ShangHai</addr:city> 15 </addr:address> 16 </bk:book> 17 </bk:books>

?

xml文件基本結構:

<books>Text文本節點("\n\t"換行+制表符)

  <book>Text文本節點("\n\t\t"換行+2個制表符)

    <name>Text文本節點("Thinking in JAVA")</name>Text文本節點("\n\t"換行+制表符)

  </book>

.......

.......

</books>

?

2. 使用SAX api 解析xml

1 package sax.parsing.example; 2 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundException; 5 import java.io.IOException; 6 import java.io.Reader; 7 8 import org.testng.annotations.Test; 9 import org.xml.sax.Attributes; 10 import org.xml.sax.ContentHandler; 11 import org.xml.sax.InputSource; 12 import org.xml.sax.Locator; 13 import org.xml.sax.SAXException; 14 import org.xml.sax.XMLReader; 15 import org.xml.sax.helpers.XMLReaderFactory; 16 17 import bsh.This; 18 19 20 class MyContentHandler implements ContentHandler { 21 22 private StringBuffer stringBuffer; 23 int frontBlankCount = 0; 24 25 26 public String toBlankString(int count) { 27 StringBuffer buffer = new StringBuffer(); 28 for (int i=0; i<count; i++) 29 buffer.append(" "); 30 return buffer.toString(); 31 } 32 33 @Override 34 public void setDocumentLocator(Locator locator) { 35 System.out.println(this.toBlankString(this.frontBlankCount) 36 + ">>> set document_locator : (lineNumber = " + locator.getLineNumber() 37 + ", columnNumber = " + locator.getColumnNumber() 38 + ", systemId = " + locator.getSystemId() 39 + ". publicId = " + locator.getPublicId() 40 + ")" 41 ); 42 } 43 44 @Override 45 public void startDocument() throws SAXException { 46 System.out.println(this.toBlankString(frontBlankCount) + ">>> start document"); 47 } 48 49 @Override 50 public void endDocument() throws SAXException { 51 System.out.print(this.toBlankString(frontBlankCount) + ">>> end document"); 52 } 53 54 @Override 55 public void startPrefixMapping(String prefix, String uri) throws SAXException { 56 System.out.println("\n" + this.toBlankString(this.frontBlankCount) 57 + ">>> start prefix_mapping : xmlns:" + prefix + "=\"" + uri + "\""); 58 } 59 60 @Override 61 public void endPrefixMapping(String prefix) throws SAXException { 62 System.out.print("\n" + this.toBlankString(this.frontBlankCount) + ">>> end prefix_mapping : " + prefix); 63 } 64 65 @Override 66 public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { 67 System.out.print(this.toBlankString(this.frontBlankCount++) + ">>> start element : " 68 + qName + "(" + uri + ")" 69 ); 70 } 71 72 @Override 73 public void endElement(String uri, String localName, String qName) throws SAXException { 74 System.out.print(this.toBlankString(--this.frontBlankCount) + ">>> end element : " 75 + qName + "(" + uri + ")" 76 ); 77 } 78 79 /** 80 * Text文本節點 處理 81 */ 82 @Override 83 public void characters(char[] ch, int start, int length) throws SAXException { 84 85 StringBuffer buffer = new StringBuffer(); 86 87 for (int i=start; i<start+length; i++) { 88 switch (ch[i]) { 89 case '\\': buffer.append("\\\\");break; 90 case '\r': buffer.append("\\r");break; 91 case '\n': buffer.append("\\n");break; 92 case '\t': buffer.append("\\t");break; 93 case '\"': buffer.append("\\\"");break; 94 default: buffer.append(ch[i]); 95 } 96 } 97 System.out.println("\t>>> characters(" + length + "): " + buffer.toString()); 98 } 99 100 @Override 101 public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { 102 103 StringBuffer buffer = new StringBuffer(); 104 105 for (int i=start; i<start+length; i++) { 106 switch (ch[i]) { 107 case '\\': buffer.append("\\\\");break; 108 case '\r': buffer.append("\\r");break; 109 case '\n': buffer.append("\\n");break; 110 case '\t': buffer.append("\\t");break; 111 case '\"': buffer.append("\\\"");break; 112 default: buffer.append(ch[i]); 113 } 114 } 115 System.out.print(this.toBlankString(frontBlankCount) 116 + ">>> ignorable whitespace(" + length + "): " + buffer.toString()); 117 } 118 119 @Override 120 public void processingInstruction(String target, String data) throws SAXException { 121 System.out.print(this.toBlankString(this.frontBlankCount) 122 + ">>> process instruction : (target = \"" + target + "\", data = \"" + data + ")"); 123 124 } 125 126 @Override 127 public void skippedEntity(String name) throws SAXException { 128 System.out.print(this.toBlankString(this.frontBlankCount) + ">>> skipped_entity : " + name); 129 } 130 } 131 132 public class SaxTest { 133 134 135 @Test 136 public void test() throws SAXException, FileNotFoundException, IOException { 137 138 139 XMLReader reader = XMLReaderFactory.createXMLReader(); 140 reader.setFeature("http://xml.org/sax/features/validation", true); 141 reader.setFeature("http://xml.org/sax/features/namespaces", true); 142 reader.setContentHandler(new MyContentHandler()); 143 reader.parse(new InputSource(new FileInputStream("src/sax/parsing/example/books.xml"))); 144 145 } 146 }

輸出結果:

>>> set document_locator : (lineNumber = 1, columnNumber = 1, systemId = null. publicId = null)
>>> start document
[Error] :5:10: Document is invalid: no grammar found.
[Error] :5:10: Document root element "bk:books", must match DOCTYPE root "null".

>>> start prefix_mapping : xmlns:bk="http://test.org/books"
>>> start element : bk:books(http://test.org/books) >>> characters(2): \n\t
  >>> start element : bk:book(http://test.org/books) >>> characters(3): \n\t\t
    >>> start element : bk:name(http://test.org/books) >>> characters(16): Thinking in JAVA
    >>> end element : bk:name(http://test.org/books) >>> characters(2): \n\t
  >>> end element : bk:book(http://test.org/books) >>> characters(2): \n\t
  >>> start element : bk:book(http://test.org/books) >>> characters(3): \n\t\t
    >>> start element : bk:name(http://test.org/books) >>> characters(10): Core JAVA2
    >>> end element : bk:name(http://test.org/books) >>> characters(2): \n\t
  >>> end element : bk:book(http://test.org/books) >>> characters(2): \n\t
  >>> start element : bk:book(http://test.org/books) >>> characters(3): \n\t\t
    >>> start element : bk:name(http://test.org/books) >>> characters(10): C++ primer
    >>> end element : bk:name(http://test.org/books) >>> characters(3): \n\t\t

    >>> start prefix_mapping : xmlns:addr="http://test.org/address"
    >>> start element : addr:address(http://test.org/address) >>> characters(4): \n\t\t\t
      >>> start element : addr:state(http://test.org/address) >>> characters(5): China
      >>> end element : addr:state(http://test.org/address) >>> characters(4): \n\t\t\t
      >>> start element : addr:city(http://test.org/address) >>> characters(8): ShangHai
      >>> end element : addr:city(http://test.org/address) >>> characters(3): \n\t\t
    >>> end element : addr:address(http://test.org/address)
    >>> end prefix_mapping : addr >>> characters(2): \n\t
  >>> end element : bk:book(http://test.org/books) >>> characters(1): \n
>>> end element : bk:books(http://test.org/books)
>>> end prefix_mapping : bk>>> end document

?

轉載于:https://www.cnblogs.com/asnjudy/p/4236403.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的SAX解析xml (遍历DOM树各节点)的全部內容,希望文章能夠幫你解決所遇到的問題。

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