JAVA与DOM解析器基础 学习笔记
要求
-
必備知識
JAVA基礎知識。XML基礎知識。
-
開發環境
MyEclipse10
-
資料下載
源碼下載
-
文件對象模型(Document Object Model,簡稱DOM),是W3C組織推薦的處理可擴展置標語言的標準編程接口。各種語言可以按照DOM規范給出解析XML文件的解析器。Sun公司發布的JDK1.4的后續版本中提供了解析XML文件的網API(Java API for XML Processing)。關于XML語法請參考這里。為什么沒有對java類和實際對象沒做詳細說明,我已經到代碼中寫了注釋了,到這里就不做過多的說明了。
檢測命名空間: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標記的命名空間* @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(); //創建輸出句柄saxParser.parse(new File("student.xml"), handle); //開始語法解析 文件放到項目根目錄不是WebRoot} catch (Exception e) { //拋出異常// TODO Auto-generated catch block e.printStackTrace();}}}/*** 創建輸出句柄對象* @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("標記:"+localName+"的命名空間是:"+uri);elseSystem.out.println("標記:"+localName+"沒有命名空間");} }?
瀏覽器中的DOM解析器只檢測XML文件是否是規范的,而不能檢測XML文件的有效性,此時我們可以使用JAVA提供的DOM解析器來檢查一個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文件是否是規范的,并不檢查XML文件是否遵守DTD規定的約束條件。* 此時就可以使用DOM解析器來檢查一個XML文件是否是有效的。* @author licheng**/ public class TestValidate {public static void main(String[] args) {String fileName=null;Scanner reader=new Scanner(System.in); System.out.print("請輸入要驗證有效性的XML的文件:");fileName=reader.nextLine(); //從控制臺讀取一行數據DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); //DocumentBuilderFactory工廠對象 獲取自身實例 factory.setValidating(true); //設置有效性檢測為真try {DocumentBuilder builer=factory.newDocumentBuilder();//獲取DOM解析器MyHandler handler=new MyHandler(); //創建MyHandler實例builer.setErrorHandler(handler); // 設置解析器的錯誤句柄為 MyHandler的實例Document document=builer.parse(new File(fileName)); //DOM解析器解析 XML文件if(handler.errorMessage==null){ //判斷handler對象是否含有錯誤信息System.out.print(fileName+"文件是效的");}else{System.out.print(fileName+"文件是無效的");}} catch (Exception e) {// TODO Auto-generated catch block e.printStackTrace();}}}/*** 創建輸出句柄* @author Administrator**/ class MyHandler extends DefaultHandler{String errorMessage=null;/*** 一般性錯誤*/public void error(SAXParseException e) throws SAXException {errorMessage=e.getMessage();System.out.print("一般錯誤:"+ errorMessage);}/** * 致命錯誤 程序終止*/public void fatalError(SAXParseException e) throws SAXException {errorMessage=e.getMessage();System.out.print("致命錯誤:"+ errorMessage);}}?
獲取XML聲明信息,根節點名稱,指定節點的信息: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對象調用newInstance方法實例化一個DocumentBuilderFactory對象DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();try {//factory對象調用newDocumentBuilder創建 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(); //獲取根節點 是先要獲取根節點嗎String rootName=root.getNodeName(); //獲取節點的名稱System.out.println("rootName:"+rootName);System.out.println(rootName+"類型為:"+root.getNodeType()); //獲取節點類型 dom的級別 NodeList nodelist=root.getElementsByTagName("book"); //獲取節點列表int size=nodelist.getLength();for(int k=0;k<size;k++){Node node=nodelist.item(k); //獲取節點String name=node.getNodeName(); //節點名稱String content=node.getTextContent(); //獲取內容 包含子孫節點中的文本數據System.out.println(name+":"+content);//System.out.println(name+"節點類型:"+node.getNodeType()); //獲取節點類型 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();}}}?
使用遞歸方法輸出節點中的數據: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;/*** 遞歸方法輸出節點中的數據* @author licheng**/ public class JAXPTwo {/***主函數*/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();}}/*** 遞歸輸出節點數據* @param nodelist 節點列表*/public static 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){ //節點類型為TEXTText textNode=(Text)node;String content=textNode.getWholeText();System.out.print(content);}if(node.getNodeType()==Node.ELEMENT_NODE){ //節點類型為ELEMENTElement elementNode=(Element)node;String name=elementNode.getNodeName();System.out.print(name);NodeList nodes=elementNode.getChildNodes();output(nodes); //遞歸掉用該方法 }}}}?
輸出Text節點信息,統計一共有多少個Text文本節點: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;/*** 統計一共有多少個Text節點* @author licheng**/ public class JAXPText {/***主函數*/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+"個Text節點");} catch (Exception e) {e.printStackTrace();}}}class GiveData{int m=0; //text的個數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){ //節點類型為TEXTText textNode=(Text)node;String content=textNode.getWholeText();m++;System.out.print(content);}if(node.getNodeType()==Node.ELEMENT_NODE){ //節點類型為ELEMENTElement elementNode=(Element)node;String name=elementNode.getNodeName();System.out.print(name);NodeList nodes=elementNode.getChildNodes();output(nodes); //遞歸掉用該方法 }}} }?
獲取Attr屬性節點信息: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;/*** 遍歷屬性節點信息* @author licheng**/ public class JAXPAttr {/***主函數*/public static void main(String[] args) {GiveData3 give=new GiveData3();try {DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();factory.setIgnoringElementContentWhitespace(true); //忽略空白縮進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(); //獲取接點列表的長度for(int k=0;k<size;k++){Node node=nodelist.item(k); //獲取節點列表中的一項 if(node.getNodeType()==node.TEXT_NODE){ //節點類型為TEXTText textNode=(Text)node;String content=textNode.getWholeText();System.out.print(content);}if(node.getNodeType()==Node.ELEMENT_NODE){ //節點類型為ELEMENTElement elementNode=(Element)node;String name=elementNode.getNodeName();System.out.print(name);NamedNodeMap map=elementNode.getAttributes(); //獲取屬性節點集合/*** 屬性節點操作*/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); //這個確實是可行的嗎??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文件]此類通過已經存在的文件 獲取Document對象 修改DOM后 創建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;/*** 通過已經存在的文件 獲取Document對象* 修改DOM后* DOM創建XML文件* @author licheng**/ public class JAXPTransformer {public static void main(String[] args) {ModifyNode modify=new ModifyNode();try {DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();factory.setIgnoringElementContentWhitespace(true); //忽略空白縮進DocumentBuilder domParser=factory.newDocumentBuilder();Document document=domParser.parse(new File("mobileNumber.xml")); //通過已經存在的文件創建Document對象Element root=document.getDocumentElement();NodeList nodeList=root.getChildNodes();modify.modifyNode(nodeList, document); //調用修改DOM的方法TransformerFactory transFactory=TransformerFactory.newInstance(); //工廠對象獲取transFactory實例Transformer transformer=transFactory.newTransformer(); //獲取Transformer實例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; //這里獲取節點String name=elementNode.getNodeName();//節點名稱if(name.equals("用戶")){ //節點判斷m++;Node textN=document.createTextNode("80元"); //創建文本節點Node elementN=document.createElement("月租費"); //穿件節點 elementN.appendChild(textN);elementNode.appendChild(elementN);}NodeList nodes=elementNode.getChildNodes();modifyNode(nodes, document); //此處遞歸 }}}}[使用DOM生成XML文件]上例中通過已有的XML文件產生一個Document對象,而本例直接 調用 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 調用 newDocument() 方法獲取Document對象* 然后為Document節點添加子孫節點* 使用Transformer生成一個新的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); //忽略空白縮進DocumentBuilder domParser=factory.newDocumentBuilder();Document document=domParser.newDocument(); //通過調用newDocument() 方法獲取實例document.setXmlVersion("1.0"); //設置 xml版本號Element root=document.createElement("手機用戶表");document.appendChild(root); //添加根節點for(int k=1;k<=personName.length;k++){Node node=document.createElement("用戶"); //添加多個用戶節點 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; //有必要創建此對象嗎???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實例Transformer transformer=transFactory.newTransformer(); //獲取Transformer實例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 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。轉載于:https://www.cnblogs.com/Li-Cheng/p/3610424.html
總結
以上是生活随笔為你收集整理的JAVA与DOM解析器基础 学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ListView setOnItemCl
- 下一篇: 记录一下之前的