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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAXP进行DOM和SAX解析

發布時間:2023/12/18 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAXP进行DOM和SAX解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.常用XML的解析方式:DOM和SAX

1)DOM思想:將整個XML加載內存中,形成文檔對象,所以對XML操作都對內存中文檔對象進行。

2)SAX思想:一邊解析,一邊處理,一邊釋放內存資源---不允許在內存中保留大規模XML數據

3)DOM和SAX的區別

DOM:支持回寫,會將整個XML載入內存,以樹形結構方式存儲

???????? ? ?XML比較復雜的時候,或者當你需要隨機處理文檔中數據的時候不建議使用

SAX:相比DOM是一種更為輕量級的方案

???????? ?無法在讀取過程中修改XML數據

2.常用解析開發包:JAXP、DOM4J

3.DOM解析原理圖

4.使用JAXP進行DOM解析

JAXP:(Java API for XML Processing)開發包是JavaSE的一部分,它由以下幾個包及其子包組成:

org.w3c.dom:提供DOM方式解析XML的標準接口

org.xml.sax:提供SAX方式解析XML的標準接口

javax.xml:提供了解析XML文檔的類

5.JAXP進行DOM解析的實例(增刪改查)

book.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?><書架><書 ISBN="a11" 出版社="清華大學出版社"><書名>JavaSE基礎</書名><作者>張三</作者><批發價>35.00元</批發價><售價>38.00元</售價></><書 ISBN="b11" 出版社="北京大學出版社"><書名>Android</書名><作者>李四</作者><售價>38.00元</售價></> </書架>

JaxpDomDemo.java

package cn.lsl.jaxp; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList;public class JaxpDomDemo {public static void main(String[] args) throws Exception {//得到解析工廠DocumentBuilderFactoryDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//得到解析器DocumentBuilderDocumentBuilder builder = factory.newDocumentBuilder();//解析指定的XML文檔,得到代表內存DOM樹的Document對象Document document = builder.parse("src/book.xml");test8(document);}//1.得到某個具體節點內容:打印第2本書的作者public static void test1(Document document){//根據標簽的名稱獲取所有的作者元素NodeList nodeList = document.getElementsByTagName("作者");//按照索引取第2個作者元素Node node = nodeList.item(1);//打印該元素的文本String text = node.getTextContent();System.out.println(text);}// 2、遍歷所有元素節點:打印元素的名稱public static void test2(Node node){//判斷當前節點是不是一個元素節點if(node.getNodeType() == Node.ELEMENT_NODE){//如果是:打印他的名稱 System.out.println(node.getNodeName());}//查找子節點NodeList nodeList = node.getChildNodes();int len = nodeList.getLength();for (int i = 0; i < len; i++) {Node n = nodeList.item(i);test2(n);}}//3、修改某個元素節點的主體內容:把第一本書的售價改為38.00元public static void test3(Document document) throws Exception{//找到第一本書的售價NodeList nodeList = document.getElementsByTagName("售價");//設置其主體內容Node node = nodeList.item(0);node.setTextContent("38.00元");//把內存中Document樹寫回xml文件中TransformerFactory factory = TransformerFactory.newInstance();Transformer ts = factory.newTransformer();ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));}//4.向指定元素節點中增加子元素節點:第一本中增加子元素<內部價>29.00</內部價>public static void test4(Document document) throws Exception{//創建一個新的元素并設置其主體內容Element e = document.createElement("內部價");e.setTextContent("29.00元");//找到第一本書元素Node firstBookNode = document.getElementsByTagName("書").item(0);//把新節點掛接到第一本書上 firstBookNode.appendChild(e);//把內存中Document樹寫回XML文件中TransformerFactory factory = TransformerFactory.newInstance();Transformer ts = factory.newTransformer();ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));}//5.向指定元素節點上增加同級元素節點:在第一本書的售價前面增加批發價public static void test5(Document document) throws Exception{//創建一個新的元素并設置其中的主題內容Element e = document.createElement("批發價");e.setTextContent("35.00元");//找到第一本書的售價Node firstPrice = document.getElementsByTagName("售價").item(0);//在售價的前面加入新建的元素:增加子元素一定要用父元素來增加 firstPrice.getParentNode().insertBefore(e, firstPrice);//把內存中Document樹寫回XML文件中TransformerFactory factory = TransformerFactory.newInstance();Transformer ts = factory.newTransformer();ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));}//6.刪除指定元素節點:刪除內部價public static void test6(Document document) throws Exception{//找到內部價節點,用父節點刪除Node n = document.getElementsByTagName("內部價").item(0);n.getParentNode().removeChild(n);//把內存中Document書寫回XML文件中TransformerFactory factory = TransformerFactory.newInstance();Transformer ts = factory.newTransformer();ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));}//7、操作XML文件屬性:打印第一本書的出版社public static void test7(Document document){//得到第一本書Node n = document.getElementsByTagName("書").item(0);//打印指定屬性的取值Element e = (Element)n;System.out.println(e.getAttribute("出版社"));}//8、添加一個出版社屬性給第二本書public static void test8(Document document) throws Exception{//得到第二本書Node n = document.getElementsByTagName("書").item(1);//打印指定屬性的取值Element e = (Element)n;e.setAttribute("出版社", "北京大學出版社");//把內存中Document樹寫回XML文件中TransformerFactory factory = TransformerFactory.newInstance();Transformer ts = factory.newTransformer();ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));} }

6.案例(學生成績的增刪改查,采用分層開發)

案例原型

exam.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?><exam><student examid="444" idcard="333"><name>李四</name><location>大連</location><grade>97</grade></student><student examid="666" idcard="555"><name>小舒</name><location>福建</location><grade>90.0</grade></student> </exam>

實體類:Student.java

package cn.lsl.domain;public class Student {private String idcard;private String examid;private String name;private String location;private Double grade;public String getIdcard() {return idcard;}public void setIdcard(String idcard) {this.idcard = idcard;}public String getExamid() {return examid;}public void setExamid(String examid) {this.examid = examid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getLocation() {return location;}public void setLocation(String location) {this.location = location;}public Double getGrade() {return grade;}public void setGrade(Double grade) {this.grade = grade;}@Overridepublic String toString() {return "Student [examid=" + examid + ", grade=" + grade + ", idcard="+ idcard + ", location=" + location + ", name=" + name + "]";} }

工具類:DocumentUtil.java

package cn.lsl.util;import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document; //操作XML的工具類 //工具類中的異常可以拋也可以處理 public class DocumentUtil {public static Document getDocument() throws Exception{DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();return builder.parse("src/exam.xml");}public static void write2xml(Document document) throws Exception{Transformer ts = TransformerFactory.newInstance().newTransformer();ts.transform(new DOMSource(document), new StreamResult("src/exam.xml"));} }

DAO層:(StudentDao.java)

package cn.lsl.dao; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import cn.lsl.domain.Student; import cn.lsl.util.DocumentUtil;public class StudentDao {//添加學生信息到XML中public boolean createStudent(Student s){boolean result = false;try{Document document = DocumentUtil.getDocument();//創建name、location、grade元素并設置內容Element nameE = document.createElement("name");nameE.setTextContent(s.getName());Element locationE = document.createElement("location");locationE.setTextContent(s.getLocation());Element gradeE = document.createElement("grade");gradeE.setTextContent(s.getGrade()+"");//創建student元素,并設置屬性Element studentE = document.createElement("student");studentE.setAttribute("idcard", s.getIdcard());studentE.setAttribute("examid", s.getExamid());studentE.appendChild(nameE);studentE.appendChild(locationE);studentE.appendChild(gradeE);//得到exam元素,把student掛接上去Node node = document.getElementsByTagName("exam").item(0);node.appendChild(studentE);//寫回XML文件中 DocumentUtil.write2xml(document);result = true;}catch(Exception e){throw new RuntimeException(e); //異常轉義。異常鏈 }return result;}//根據準考證號查詢學生信息public Student findStudent(String examid){Student s = null;try{Document document = DocumentUtil.getDocument();//得到所有student元素NodeList nodelist = document.getElementsByTagName("student");//遍歷student元素,判斷他的examid屬性的取值是否與參數匹配for (int i = 0; i < nodelist.getLength(); i++) {Node node = nodelist.item(i);if(node instanceof Element){Element e = (Element)node;if(e.getAttribute("examid").equals(examid)){//如果匹配,說明找到了學生,創建學生對象s = new Student();s.setExamid(examid);s.setIdcard(e.getAttribute("idcard"));s.setName(e.getElementsByTagName("name").item(0).getTextContent());s.setLocation(e.getElementsByTagName("location").item(0).getTextContent());s.setGrade(Double.parseDouble(e.getElementsByTagName("grade").item(0).getTextContent()));}}}}catch(Exception e){throw new RuntimeException(e);}return s;}//根據學生姓名刪除學生public boolean deleteStudent(String name){boolean result = false;try{//得到Document對象Document document = DocumentUtil.getDocument();NodeList nodelist = document.getElementsByTagName("name");for(int i=0; i<nodelist.getLength(); i++){Node node = nodelist.item(i);if(node.getTextContent().equals(name)){node.getParentNode().getParentNode().removeChild(node.getParentNode());//寫回XML文檔 DocumentUtil.write2xml(document);result = true;break;}}}catch(Exception e){throw new RuntimeException(e);}return result;} }

View層(Main.java)

package cn.lsl.view;import java.io.BufferedReader; import java.io.InputStreamReader;import cn.lsl.dao.StudentDao; import cn.lsl.domain.Student;public class Main {public static void main(String[] args) {try{StudentDao dao = new StudentDao();System.out.println("a、添加學生\tb、刪除學生\tc、查詢成績");System.out.println("請輸入操作類型");BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String operation = br.readLine();if("a".equals(operation)){//添加操作System.out.println("請輸入學生姓名");String name = br.readLine();System.out.println("請輸入學生準考證號");String examid = br.readLine();System.out.println("請輸入學生身份證號");String idcard = br.readLine();System.out.println("請輸入學生所在地");String location = br.readLine();System.out.println("請輸入學生成績");String grade = br.readLine();Student s = new Student();s.setExamid(examid);s.setIdcard(idcard);s.setName(name);s.setLocation(location);s.setGrade(Double.parseDouble(grade));//System.out.println(s);boolean b = dao.createStudent(s);if(b){System.out.println("---添加成功---");}else{System.out.println("對不起!數據有誤");}}else if("b".equals(operation)){System.out.println("請輸入要刪除的學生姓名:");String name = br.readLine();boolean b = dao.deleteStudent(name);if(b){System.out.println("--刪除成功--");}else{System.out.println("對不起!刪除失敗或者學生不存在");}}else if("c".equals(operation)){//查詢操作System.out.println("請輸入要查詢的學生準考證號:");String examid = br.readLine();Student s = dao.findStudent(examid);if(s == null){System.out.println("對不起!您查詢的學生不存在");}else{System.out.println(s);}}else{System.out.println("請輸入正確的操作類型");}}catch(Exception e){System.out.println("對不起!服務器忙!");}} }

7.SAX解析原理圖

?

8. SAX采用事件處理的方式解析XML文件,利用 SAX 解析 XML 文檔,涉及兩個部分:解析器和事件處理器。

9.SAX解析

實例一:

book.xml

<?xml version="1.0" encoding="UTF-8"?> <書架> <書 出版社="清華大學出版社"> <書名>JavaSE基礎</書名> <作者>張三</作者> <售價>38.00</售價> <內部價>19.00</內部價> </> <> <書名>Android</書名> <作者>李四</作者> <售價>28.00</售價> </> </書架>

SAXDemo1.java

package cn.lsl.sax;import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.XMLReader;//JAXP進行SAX解析 public class SAXDemo1 {public static void main(String[] args) throws Exception {//得到解析工廠SAXParserFactorySAXParserFactory factory = SAXParserFactory.newInstance();//得到解析器SAXParserSAXParser parser = factory.newSAXParser();//得到XML讀取器:XMLReaderXMLReader reader = parser.getXMLReader();//注冊內容處理器:ContentHandlerreader.setContentHandler(new MyContentHandler());//取出XML文檔reader.parse("src/book.xml");} }class MyContentHandler implements ContentHandler{//解析到文檔開始時被調用 @Overridepublic void startDocument() throws SAXException {System.out.println("解析到了文檔的開始");}//解析到了元素開始時被調用: qName元素名稱 @Overridepublic void startElement(String uri, String localName, String qName,Attributes atts) throws SAXException {System.out.println("解析到了元素的開始:"+qName);}//解析到了文本內容被調用 @Overridepublic void characters(char[] ch, int start, int length)throws SAXException {System.out.println("文本內容:"+new String(ch,start,length));}//解析到元素結束時被調用 @Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {System.out.println("解析到了元素的結束:"+qName);}//解析到文檔結束時被調用 @Overridepublic void endDocument() throws SAXException {System.out.println("解析到了文檔的結束");}@Overridepublic void endPrefixMapping(String prefix) throws SAXException {// TODO Auto-generated method stub }@Overridepublic void ignorableWhitespace(char[] ch, int start, int length)throws SAXException {// TODO Auto-generated method stub }@Overridepublic void processingInstruction(String target, String data)throws SAXException {// TODO Auto-generated method stub }@Overridepublic void setDocumentLocator(Locator locator) {// TODO Auto-generated method stub }@Overridepublic void skippedEntity(String name) throws SAXException {// TODO Auto-generated method stub }@Overridepublic void startPrefixMapping(String prefix, String uri)throws SAXException {// TODO Auto-generated method stub } }

實例二:

SAXDemo2.java

package cn.lsl.sax;import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.XMLReader;//打印第2本書的作者 public class SAXDemo2 {public static void main(String[] args) throws Exception {SAXParser parser = SAXParserFactory.newInstance().newSAXParser();XMLReader reader = parser.getXMLReader();reader.setContentHandler(new ContentHandler(){ //匿名內部類boolean isAuthor = false; //是不是作者標簽int index = 0; //作者標簽的索引 @Overridepublic void startElement(String uri, String localName,String qName, Attributes atts) throws SAXException {if("作者".equals(qName)){isAuthor = true;}}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {if(isAuthor&&index==1){System.out.println(new String(ch,start,length));}}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {if("作者".equals(qName)){index++;}isAuthor = false;}@Overridepublic void endDocument() throws SAXException {// TODO Auto-generated method stub }@Overridepublic void endPrefixMapping(String prefix) throws SAXException {// TODO Auto-generated method stub }@Overridepublic void ignorableWhitespace(char[] ch, int start, int length)throws SAXException {// TODO Auto-generated method stub }@Overridepublic void processingInstruction(String target, String data)throws SAXException {// TODO Auto-generated method stub }@Overridepublic void setDocumentLocator(Locator locator) {// TODO Auto-generated method stub }@Overridepublic void skippedEntity(String name) throws SAXException {// TODO Auto-generated method stub }@Overridepublic void startDocument() throws SAXException {// TODO Auto-generated method stub }@Overridepublic void startPrefixMapping(String prefix, String uri)throws SAXException {// TODO Auto-generated method stub }});reader.parse("src/book.xml");} }

實例三:讀取XML內容,封裝到JavaBean

Book.java

package cn.lsl.domain;public class Book {private String name;private String author;private Double price;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;}@Overridepublic String toString() {return "Book [author=" + author + ", name=" + name + ", price=" + price+ "]";} }

SAXDemo3.java

package cn.lsl.sax;import java.util.ArrayList; import java.util.List;import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler;import cn.lsl.domain.Book;//讀取XML內容,封裝到JavaBean public class SAXDemo3 {public static void main(String[] args) throws Exception {SAXParser parser = SAXParserFactory.newInstance().newSAXParser();XMLReader reader = parser.getXMLReader();final List books = new ArrayList();reader.setContentHandler(new DefaultHandler(){Book book = null;String currentTagName = null;@Overridepublic void startElement(String uri, String localName,String qName, Attributes attributes) throws SAXException {if("書".equals(qName)){book = new Book();}currentTagName = qName;}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {if("書名".equals(currentTagName)){book.setName(new String(ch,start,length));}if("作者".equals(currentTagName)){book.setAuthor(new String(ch,start,length));}if("售價".equals(currentTagName)){book.setPrice(Double.parseDouble(new String(ch,start,length)));}}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {if("書".equals(qName)){books.add(book);book = null;}currentTagName = null;}});reader.parse("src/book.xml");for (Object b:books) {System.out.println(b);}} }

?

?

轉載于:https://www.cnblogs.com/EvanLiu/p/3665113.html

總結

以上是生活随笔為你收集整理的JAXP进行DOM和SAX解析的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 成人精品在线视频 | a天堂中文字幕 | 亚洲小说图片区 | 日本高清网站 | 国产一区二区精品在线观看 | 韩国日本在线 | 伊人艹| 日本电影一区 | 国产不卡在线观看 | 四虎网站最新网址 | 毛片的网址 | 91丨九色丨国产在线 | 久久丫精品 | 超碰人人国产 | 国产精品美女久久久久久久久 | 黄色三级图片 | 一区二区三区精品视频在线观看 | 99re在线观看视频 | 欧美日韩中文国产一区发布 | 在线观看黄色大片 | 欧美激情视频一区二区三区在线播放 | 日韩一级在线观看视频 | jizz18国产| 丰满岳乱妇国产精品一区 | 亚洲一区在线视频观看 | 国产精品乱子伦 | 久久一区国产 | 强伦人妻一区二区三区 | 少妇不卡视频 | 黄色中文| 超碰在线9 | 日韩在线视频免费观看 | 欧美丰满熟妇xxxxx | 不卡av电影在线观看 | 欧美日韩在线视频免费播放 | 免费啊v在线观看 | 日韩在线一级 | 久久亚洲一区二区 | 国产一级自拍视频 | 午夜视频在线免费播放 | 欧美成人做爰猛烈床戏 | h片免费网站 | 激情久久网 | 韩国三级中文字幕 | 男人吃奶视频 | 日本黄色小说 | 久久久视频在线观看 | 91免费高清 | 日本少妇毛茸茸高潮 | 狠狠久久婷婷 | 国产欧美精品一区 | 他揉捏她两乳不停呻吟动态图 | 图片区 小说区 区 亚洲五月 | 午夜黄色福利 | 中文字幕第6页 | 欧美激情亚洲激情 | 精东影业一区二区三区 | 激情五月深爱五月 | 黄色aa级片 | 国产18在线观看 | 男生和女生一起差差差很痛的视频 | 石原莉奈在线播放 | 91性高潮久久久久久久久 | 国产草草浮力影院 | 97超碰中文字幕 | 亚洲国产tv | 国产精品一区二区三区四区五区 | 男女黄床上色视频免费的软件 | 91高清视频在线 | www日| 黄色在线播放网站 | 国产免费一区二区三区四区五区 | 日本视频黄色 | 亚洲欧美另类在线观看 | 一级毛片黄片 | 免费在线观看毛片视频 | 91亚洲一线产区二线产区 | 黄频在线看 | 久久青青草原亚洲av无码麻豆 | 天堂av亚洲av国产av电影 | 一区二区久久 | 亚洲三级欧美 | 男女视频在线观看免费 | 亚洲va国产天堂va久久 en | 中文字幕有码在线视频 | 成年人黄色片 | 国产精品一区二区三区四区在线观看 | 天天天干干干 | 国内9l自拍 | 人人澡人人爱 | 被绑在床强摁做开腿呻吟 | 精品人妻无码一区二区色欲产成人 | 国产男女av | 秘密爱大尺度做爰呻吟 | 国产黄色免费视频 | 日本三级理论片 | 精品亚洲一区二区三区四区五区 | 欧美图片一区二区 | 蜜桃tv一区二区三区 |