文件對象模型(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 stub SAXParserFactory 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); else System.out.println("標記:"+localName+"沒有命名空間"); } }
瀏覽器中的DOM解析器只檢測XML文件是不是規範的,而不能檢測XML文件的有效性,此時咱們能夠使用JAVA提供的DOM解析器來檢查一個XML文件的有效性:app
TestValidate.javadom
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.javaide
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){ //節點類型爲TEXT Text textNode=(Text)node; String content=textNode.getWholeText(); System.out.print(content); } if(node.getNodeType()==Node.ELEMENT_NODE){ //節點類型爲ELEMENT Element elementNode=(Element)node; String name=elementNode.getNodeName(); System.out.print(name); NodeList nodes=elementNode.getChildNodes(); output(nodes); //遞歸掉用該方法 } } } }
輸出Text節點信息,統計一共有多少個Text文本節點:JAXPText.javaui
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){ //節點類型爲TEXT Text textNode=(Text)node; String content=textNode.getWholeText(); m++; System.out.print(content); } if(node.getNodeType()==Node.ELEMENT_NODE){ //節點類型爲ELEMENT Element 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){ //節點類型爲TEXT Text textNode=(Text)node; String content=textNode.getWholeText(); System.out.print(content); } if(node.getNodeType()==Node.ELEMENT_NODE){ //節點類型爲ELEMENT Element 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(); } } }