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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA与DOM解析器基础 学习笔记

發(fā)布時(shí)間:2025/3/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA与DOM解析器基础 学习笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

要求

    • 必備知識(shí)

      JAVA基礎(chǔ)知識(shí)。XML基礎(chǔ)知識(shí)。

    • 開發(fā)環(huán)境

      MyEclipse10

    • 資料下載

      源碼下載

文件對象模型(Document Object Model,簡稱DOM),是W3C組織推薦的處理可擴(kuò)展置標(biāo)語言的標(biāo)準(zhǔn)編程接口。各種語言可以按照DOM規(guī)范給出解析XML文件的解析器。Sun公司發(fā)布的JDK1.4的后續(xù)版本中提供了解析XML文件的網(wǎng)API(Java API for XML Processing)。關(guān)于XML語法請參考這里。為什么沒有對java類和實(shí)際對象沒做詳細(xì)說明,我已經(jīng)到代碼中寫了注釋了,到這里就不做過多的說明了。

檢測命名空間:TestNameSpace.java

import java.io.File; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler;/*** 檢查命xml標(biāo)記的命名空間* @author licheng**/ public class TestNameSpace {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSAXParserFactory factory=SAXParserFactory.newInstance(); //語法解析器的工廠對象factory.setNamespaceAware(true); //允許使用命名空間try {SAXParser saxParser=factory.newSAXParser(); //獲取語法解析器MyHeader handle=new MyHeader(); //創(chuàng)建輸出句柄saxParser.parse(new File("student.xml"), handle); //開始語法解析 文件放到項(xiàng)目根目錄不是WebRoot} catch (Exception e) { //拋出異常// TODO Auto-generated catch block e.printStackTrace();}}}/*** 創(chuàng)建輸出句柄對象* @author Administrator**/ class MyHeader extends DefaultHandler{@Override //覆蓋父類的方法public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {if(uri.length()>0) System.out.println("標(biāo)記:"+localName+"的命名空間是:"+uri);elseSystem.out.println("標(biāo)記:"+localName+"沒有命名空間");} }

?

瀏覽器中的DOM解析器只檢測XML文件是否是規(guī)范的,而不能檢測XML文件的有效性,此時(shí)我們可以使用JAVA提供的DOM解析器來檢查一個(gè)XML文件的有效性:

TestValidate.java

import java.io.File; import java.io.IOException; import java.util.Scanner;import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.helpers.DefaultHandler;/*** 檢查XML文件的有效性* 瀏覽器中的XML解析器只檢查XML文件是否是規(guī)范的,并不檢查XML文件是否遵守DTD規(guī)定的約束條件。* 此時(shí)就可以使用DOM解析器來檢查一個(gè)XML文件是否是有效的。* @author licheng**/ public class TestValidate {public static void main(String[] args) {String fileName=null;Scanner reader=new Scanner(System.in); System.out.print("請輸入要驗(yàn)證有效性的XML的文件:");fileName=reader.nextLine(); //從控制臺(tái)讀取一行數(shù)據(jù)DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); //DocumentBuilderFactory工廠對象 獲取自身實(shí)例 factory.setValidating(true); //設(shè)置有效性檢測為真try {DocumentBuilder builer=factory.newDocumentBuilder();//獲取DOM解析器MyHandler handler=new MyHandler(); //創(chuàng)建MyHandler實(shí)例builer.setErrorHandler(handler); // 設(shè)置解析器的錯(cuò)誤句柄為 MyHandler的實(shí)例Document document=builer.parse(new File(fileName)); //DOM解析器解析 XML文件if(handler.errorMessage==null){ //判斷handler對象是否含有錯(cuò)誤信息System.out.print(fileName+"文件是效的");}else{System.out.print(fileName+"文件是無效的");}} catch (Exception e) {// TODO Auto-generated catch block e.printStackTrace();}}}/*** 創(chuàng)建輸出句柄* @author Administrator**/ class MyHandler extends DefaultHandler{String errorMessage=null;/*** 一般性錯(cuò)誤*/public void error(SAXParseException e) throws SAXException {errorMessage=e.getMessage();System.out.print("一般錯(cuò)誤:"+ errorMessage);}/** * 致命錯(cuò)誤 程序終止*/public void fatalError(SAXParseException e) throws SAXException {errorMessage=e.getMessage();System.out.print("致命錯(cuò)誤:"+ errorMessage);}}

?

獲取XML聲明信息,根節(jié)點(diǎn)名稱,指定節(jié)點(diǎn)的信息:JAXPOne.java

import java.io.File; import java.io.IOException;import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException;/*** JAVA DOM解析器入門 * 輸出書籍信息* @author licheng**/ public class JAXPOne {public static void main(String[] args) {// DocumentBuilderFactory對象調(diào)用newInstance方法實(shí)例化一個(gè)DocumentBuilderFactory對象DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();try {//factory對象調(diào)用newDocumentBuilder創(chuàng)建 domParser DOM解析器DocumentBuilder domParser=factory.newDocumentBuilder();try {Document document=domParser.parse(new File("student.xml"));String version=document.getXmlVersion(); //獲取XML版本號System.out.println("version:"+version);String encoding=document.getXmlEncoding(); //獲取聲明編碼System.out.println("encoding:"+encoding);Element root=document.getDocumentElement(); //獲取根節(jié)點(diǎn) 是先要獲取根節(jié)點(diǎn)嗎String rootName=root.getNodeName(); //獲取節(jié)點(diǎn)的名稱System.out.println("rootName:"+rootName);System.out.println(rootName+"類型為:"+root.getNodeType()); //獲取節(jié)點(diǎn)類型 dom的級別 NodeList nodelist=root.getElementsByTagName("book"); //獲取節(jié)點(diǎn)列表int size=nodelist.getLength();for(int k=0;k<size;k++){Node node=nodelist.item(k); //獲取節(jié)點(diǎn)String name=node.getNodeName(); //節(jié)點(diǎn)名稱String content=node.getTextContent(); //獲取內(nèi)容 包含子孫節(jié)點(diǎn)中的文本數(shù)據(jù)System.out.println(name+":"+content);//System.out.println(name+"節(jié)點(diǎn)類型:"+node.getNodeType()); //獲取節(jié)點(diǎn)類型 dom的級別 }} catch (SAXException e) {// TODO Auto-generated catch block e.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}} catch (ParserConfigurationException e) {// TODO Auto-generated catch block e.printStackTrace();}}}

?

使用遞歸方法輸出節(jié)點(diǎn)中的數(shù)據(jù):JAXPTwo.java

import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; import org.xml.sax.SAXException;/*** 遞歸方法輸出節(jié)點(diǎn)中的數(shù)據(jù)* @author licheng**/ public class JAXPTwo {/***主函數(shù)*/public static void main(String[] args) {DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();try {DocumentBuilder domParser=factory.newDocumentBuilder();Document document=domParser.parse(new File("bookinfo.xml"));NodeList nodeList=document.getChildNodes();output(nodeList);} catch (Exception e) {e.printStackTrace();}}/*** 遞歸輸出節(jié)點(diǎn)數(shù)據(jù)* @param nodelist 節(jié)點(diǎn)列表*/public static void output(NodeList nodelist){int size=nodelist.getLength(); //獲取接點(diǎn)列表的長度for(int k=0;k<size;k++){Node node=nodelist.item(k); //獲取節(jié)點(diǎn)列表中的一項(xiàng) if(node.getNodeType()==node.TEXT_NODE){ //節(jié)點(diǎn)類型為TEXTText textNode=(Text)node;String content=textNode.getWholeText();System.out.print(content);}if(node.getNodeType()==Node.ELEMENT_NODE){ //節(jié)點(diǎn)類型為ELEMENTElement elementNode=(Element)node;String name=elementNode.getNodeName();System.out.print(name);NodeList nodes=elementNode.getChildNodes();output(nodes); //遞歸掉用該方法 }}}}

?

輸出Text節(jié)點(diǎn)信息,統(tǒng)計(jì)一共有多少個(gè)Text文本節(jié)點(diǎn):JAXPText.java

import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; import org.xml.sax.SAXException;/*** 統(tǒng)計(jì)一共有多少個(gè)Text節(jié)點(diǎn)* @author licheng**/ public class JAXPText {/***主函數(shù)*/public static void main(String[] args) {GiveData give=new GiveData();DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();try {DocumentBuilder domParser=factory.newDocumentBuilder();Document document=domParser.parse(new File("bookinfo.xml"));NodeList nodeList=document.getChildNodes();give.output(nodeList);System.out.println("一共有"+give.m+"個(gè)Text節(jié)點(diǎn)");} catch (Exception e) {e.printStackTrace();}}}class GiveData{int m=0; //text的個(gè)數(shù)public void output(NodeList nodelist){int size=nodelist.getLength(); //獲取接點(diǎn)列表的長度for(int k=0;k<size;k++){Node node=nodelist.item(k); //獲取節(jié)點(diǎn)列表中的一項(xiàng) if(node.getNodeType()==node.TEXT_NODE){ //節(jié)點(diǎn)類型為TEXTText textNode=(Text)node;String content=textNode.getWholeText();m++;System.out.print(content);}if(node.getNodeType()==Node.ELEMENT_NODE){ //節(jié)點(diǎn)類型為ELEMENTElement elementNode=(Element)node;String name=elementNode.getNodeName();System.out.print(name);NodeList nodes=elementNode.getChildNodes();output(nodes); //遞歸掉用該方法 }}} }

?

獲取Attr屬性節(jié)點(diǎn)信息:JAXPAttr.java

import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; import org.xml.sax.SAXException;/*** 遍歷屬性節(jié)點(diǎn)信息* @author licheng**/ public class JAXPAttr {/***主函數(shù)*/public static void main(String[] args) {GiveData3 give=new GiveData3();try {DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();factory.setIgnoringElementContentWhitespace(true); //忽略空白縮進(jìn)DocumentBuilder domParser=factory.newDocumentBuilder();Document document=domParser.parse(new File("student.xml"));Element root=document.getDocumentElement();NodeList nodeList=root.getChildNodes();give.output(nodeList);} catch (Exception e) {e.printStackTrace();}}}class GiveData3{public void output(NodeList nodelist){int size=nodelist.getLength(); //獲取接點(diǎn)列表的長度for(int k=0;k<size;k++){Node node=nodelist.item(k); //獲取節(jié)點(diǎn)列表中的一項(xiàng) if(node.getNodeType()==node.TEXT_NODE){ //節(jié)點(diǎn)類型為TEXTText textNode=(Text)node;String content=textNode.getWholeText();System.out.print(content);}if(node.getNodeType()==Node.ELEMENT_NODE){ //節(jié)點(diǎn)類型為ELEMENTElement elementNode=(Element)node;String name=elementNode.getNodeName();System.out.print(name);NamedNodeMap map=elementNode.getAttributes(); //獲取屬性節(jié)點(diǎn)集合/*** 屬性節(jié)點(diǎn)操作*/for(int m=0;m<map.getLength();m++){Attr attrNode=(Attr)map.item(m);String attrName=attrNode.getName(); //屬性名稱String attrValue=attrNode.getValue(); //屬性值System.out.print(" "+attrName+"="+attrValue);}NodeList nodes=elementNode.getChildNodes();output(nodes); //遞歸掉用該方法 }}} }

?

忽略文本空白:JAXPEight.java

import java.io.IOException;import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; import org.xml.sax.SAXException;public class JAXPEight {public static void main(String[] args) {GiveD give=new GiveD();DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();factory.setIgnoringElementContentWhitespace(true); //這個(gè)確實(shí)是可行的嗎??try {DocumentBuilder domPaser=factory.newDocumentBuilder();Document document=domPaser.parse("student.xml");Element root=document.getDocumentElement();NodeList nodeList=root.getChildNodes();give.output(nodeList);} catch (Exception e) {// TODO Auto-generated catch block e.printStackTrace();}}}class GiveD{int m=0;public void output(NodeList nodeList){int size=nodeList.getLength();for(int k=0;k<size;k++){Node node=nodeList.item(k);if(node.getNodeType()==Node.TEXT_NODE){Text textNode=(Text)node;String content=textNode.getWholeText();m++;System.out.print(content);}if(node.getNodeType()==Node.ELEMENT_NODE){Element elementNode=(Element)node;String name=elementNode.getNodeName();System.out.print(" ");NodeList nodes=elementNode.getChildNodes();output(nodes);}}}}

?

[使用DOM生成XML文件]此類通過已經(jīng)存在的文件 獲取Document對象 修改DOM后 創(chuàng)建XML文件:JAXPTransformer.java

import java.io.File; import java.io.FileOutputStream;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;/*** 通過已經(jīng)存在的文件 獲取Document對象* 修改DOM后* DOM創(chuàng)建XML文件* @author licheng**/ public class JAXPTransformer {public static void main(String[] args) {ModifyNode modify=new ModifyNode();try {DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();factory.setIgnoringElementContentWhitespace(true); //忽略空白縮進(jìn)DocumentBuilder domParser=factory.newDocumentBuilder();Document document=domParser.parse(new File("mobileNumber.xml")); //通過已經(jīng)存在的文件創(chuàng)建Document對象Element root=document.getDocumentElement();NodeList nodeList=root.getChildNodes();modify.modifyNode(nodeList, document); //調(diào)用修改DOM的方法TransformerFactory transFactory=TransformerFactory.newInstance(); //工廠對象獲取transFactory實(shí)例Transformer transformer=transFactory.newTransformer(); //獲取Transformer實(shí)例DOMSource domSource=new DOMSource(document);File file=new File("newXML.xml");FileOutputStream out=new FileOutputStream(file);StreamResult xmlResult=new StreamResult(out);transformer.transform(domSource, xmlResult);out.close();} catch (Exception e) {e.printStackTrace();}} } class ModifyNode{int m=0;Document document;public void modifyNode(NodeList nodeList,Document document){this.document=document;int size=nodeList.getLength();for(int k=0;k<size;k++){Node node=nodeList.item(k);if(node.getNodeType()==Node.ELEMENT_NODE){Element elementNode=(Element)node; //這里獲取節(jié)點(diǎn)String name=elementNode.getNodeName();//節(jié)點(diǎn)名稱if(name.equals("用戶")){ //節(jié)點(diǎn)判斷m++;Node textN=document.createTextNode("80元"); //創(chuàng)建文本節(jié)點(diǎn)Node elementN=document.createElement("月租費(fèi)"); //穿件節(jié)點(diǎn) elementN.appendChild(textN);elementNode.appendChild(elementN);}NodeList nodes=elementNode.getChildNodes();modifyNode(nodes, document); //此處遞歸 }}}}

[使用DOM生成XML文件]上例中通過已有的XML文件產(chǎn)生一個(gè)Document對象,而本例直接 調(diào)用 newDocument()方法獲取對象。

JAXPTransformer2.java

import java.io.File; import java.io.FileOutputStream;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;/*** domPaser 調(diào)用 newDocument() 方法獲取Document對象* 然后為Document節(jié)點(diǎn)添加子孫節(jié)點(diǎn)* 使用Transformer生成一個(gè)新的XML文件* @author licheng**/ public class JAXPTransformer2 {public static void main(String[] args) {try {String[] personName={"張三","李四","王五"};String[] phoneNumber={"123","456","789"};DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();factory.setIgnoringElementContentWhitespace(true); //忽略空白縮進(jìn)DocumentBuilder domParser=factory.newDocumentBuilder();Document document=domParser.newDocument(); //通過調(diào)用newDocument() 方法獲取實(shí)例document.setXmlVersion("1.0"); //設(shè)置 xml版本號Element root=document.createElement("手機(jī)用戶表");document.appendChild(root); //添加根節(jié)點(diǎn)for(int k=1;k<=personName.length;k++){Node node=document.createElement("用戶"); //添加多個(gè)用戶節(jié)點(diǎn) root.appendChild(node);}NodeList nodeList=document.getElementsByTagName("用戶");int size=nodeList.getLength();for(int k=0;k<size;k++){Node node=nodeList.item(k);if(node.getNodeType()==Node.ELEMENT_NODE){ Element elementNode=(Element)node; //有必要?jiǎng)?chuàng)建此對象嗎???Node nodeName=document.createElement("姓名");Node nodeNumber=document.createElement("號碼");nodeName.appendChild(document.createTextNode(personName[k]));nodeNumber.appendChild(document.createTextNode(phoneNumber[k]));elementNode.appendChild(nodeName);elementNode.appendChild(nodeNumber);}}TransformerFactory transFactory=TransformerFactory.newInstance(); //工廠對象獲取transFactory實(shí)例Transformer transformer=transFactory.newTransformer(); //獲取Transformer實(shí)例DOMSource domSource=new DOMSource(document);File file=new File("phone.xml");FileOutputStream out=new FileOutputStream(file);StreamResult xmlResult=new StreamResult(out);transformer.transform(domSource, xmlResult);out.close();} catch (Exception e) {e.printStackTrace();}} }

?

作者:Li-Cheng 出處:http://www.cnblogs.com/Li-Cheng/p/3610424.html 本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。

轉(zhuǎn)載于:https://www.cnblogs.com/Li-Cheng/p/3610424.html

總結(jié)

以上是生活随笔為你收集整理的JAVA与DOM解析器基础 学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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