<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      java-XML

      XML不再多說,XML 約束也不用說了,這里講講java如何對XML操作。

      java中使用XML,目前常用的就是Jaxp(sun)和dom4j了,這里先講講java自帶的Jaxp包

      JAXP 開發包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包組成

      Jaxp的xml解析器有兩種,一種是DOM解析器,一種是SAX解析器,兩種各自應用在不同的場景上。

      在DOM解析時,會把xml中各個節點視為對象,然后根據父子關系相互嵌套。優點時容易操縱,缺點也很明顯,必須全部通讀xml并加載進內存。

      DOM解析的流程:

      1,DocumentBuilderFactory是抽象類,newInstance()方法會根據本地平臺安裝的xml解析器自動創建相應的工廠實力

      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      

      2,DocumentBuilder的newDocumentBuilder()方法會得到本地xml解析器相應的DocumentBuilder實力

      DocumentBuilder documentB = dbf.newDocumentBuilder();
      

      3,解析xml,根據DocumentBuilder的parse方法。

      Document document = documentB.parse(new File(path));
      
      //看文檔可以知道,parse可以從解析File、InputSource(經過包裝的InputStream)、InputStream和URI字符串

      4,Document代表了整個XML文檔,首先獲取根節點,Element就是標簽,它們都屬于Node,也就是說,都實現了Node接口

      Element root=document.getDocumentElement();

      5,下面就是增刪改查了

      增加結點

      //增加一個結點,注意,增加節點是對document操作,Document實現了這個方法
      Element newStudent=document.createElement("student");
      			
      //增加一個屬性,屬性也算是結點,一切都是Node
      Attr cid=document.createAttribute("idcard");
      //給屬性設置值
      cid.setValue("1121");
      			
      //將屬性添加進這個標簽
      newStudent.setAttributeNode(cid);
      			
      //最后,將這個結點添加進根節點,注意,是對根節點添加,不是Document
      root.appendChild(newStudent);
      

      提取某節點信息(查)

      //首先根據第3步,已經獲得根結點,也就是Element root
      
      
      //獲取所有標簽名為sutdent的節點集合
      NodeList students=root.getElementsByTagName("student");
      
      //至于獲取標簽屬性以及text內容,自行看手冊
      
      //要注意的是,換行和制表符'\n\t'這些,也會被當做text內容解析
      //至于xml的編碼問題,都是自動的,不用手動設置了。
      

      更改結點內容(很多都是Node接口的方法,自行查看手冊即可)

      //設置標簽內容
      Node.setTextContent(String text)
      
      //設置屬性內容
      Attr.setValue(String value)
      

      刪除結點

      Node.removeChild(Node node)
      

      6,操作完xml,保存結果

      javax.xml.transform包中的Transformer類用于把代表XML文件的Document對象轉換為某種格式后進行輸出,例如把xml文件應用樣式表后轉成一個html文檔。
      利用這個對象,當然也可以把Document對象又重新寫入到一個XML文件中。
      //1、獲得Transformer工廠
      TransformerFactory tff=TransformerFactory.newInstance();
      
      //2、對于DOM對象,使用樹來表示,肯定是個多叉樹了,,,
      //這個類,就是將樹,變為結果樹
      Transformer tf = tff.newTransformer();
      
      //3、把document(DOM)轉換為xml source
      Source sc=new DOMSource(document);
      
      //4、創建一個DOM目標,這里是個流
      Result rs=new StreamResult(new File(path_URI));
      
      //5、將 XML Source 轉換為 Result,這樣就寫入數據流了
      tf.transform(sc, rs);

      DOM解析就到這里,如果以網絡流讀取一個大的xml文件的話,這樣肯定是不行的,不可能一直等到它全部讀完載入內存再操作吧。。。。。光讀取的話,就用SAX了。

      SAX采用事件處理的方式解析XML文件,利用 SAX 解析 XML 文檔,涉及兩個部分:解析器和事件處理器:
      ?解析器可以使用JAXP的API創建,創建出SAX解析器后,就可以指定解析器去解析某個XML文檔。
      ?解析器采用SAX方式在解析某個XML文檔時,它只要解析到XML文檔的一個組成部分,都會去調用事件處理器的一個方法,解析器在調用事件處理器的方法時,會把當前解析到的xml文件內容作為方法的參數傳遞給事件處理器。

      事件處理器由程序員編寫,程序員通過事件處理器中方法的參數,就可以很輕松地得到sax解析器解析到的數據,從而可以決定如何對數據進行處理

      我們常用的就是ContentHandler了。

      下面是sax示例

      //定義工廠api,用以配置和獲取sax解析器
      		SAXParserFactory spf = SAXParserFactory.newInstance();
      		
      		//得到解析器對象
      		SAXParser sp = spf.newSAXParser();
      		
      		//得到一個xmlreader讀取器
      		XMLReader xmlReader = sp.getXMLReader();
      
      		//注冊一個內容事件處理器 ContentHandler,一般情況下,使用ContentHandler接口的已知
      		//子類DefaultHandler就行了
      		
      		xmlReader.setContentHandler(new DefaultHandler(){
      			//為了方便,以內部類重寫需要使用到的方法
      			
      			//開始讀取標簽
      			public void startElement(String uri, //命名空間
                          String localName, //標簽名
                          String qName, //限定名稱
                          Attributes attributes //屬性
                          ){
      				
      				///////////////////////////
      				//獲取標簽的個數
      				attr.getLength();
      				//其它的看手冊				
      			}
      			
      			//開始讀取文檔
      			public void startDocument(){
      				
      			}
      			
      			//讀取到標簽尾
      			public void endElement( String namespaceURI,
      		              String localName,
      		              String qName ) {
      
      		   }
      			
      			//讀取標簽體,注意的是,sax是分段讀取的,每次最大讀取是2kb
      			public void characters(char[] ch,
                          int start,
                          int length
                         ){
      				//讀取大數據的時候注意sax是分段讀取的,每次最大讀取是2kb
      				
      				
      			}
                 
      
      			
      		});
      		
      		
      		//開始讀取xml數據
      		xmlReader.parse("book.xml");
      

      到這里,我們發現SAX雖然比DOM效率高,但是它是順序讀取的,無法回頭,且只能從頭到尾。

      現在就可以使用Dom4j了,它是第三方包

      Dom4j是一個簡單、靈活的開放源代碼的庫。Dom4j是由早期開發JDOM的人分離出來而后獨立開發的。與JDOM不同的是,dom4j使用接口和抽象基類,雖然Dom4j的API相對要復雜一些,但它提供了比JDOM更好的靈活性。
      Dom4j是一個非常優秀的Java XML API,具有性能優異、功能強大和極易使用的特點。現在很多軟件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
      使用Dom4j開發,需下載dom4j相應的jar文件。

      lDOM4j中,獲得Document對象的方式有三種:
      //1.讀取XML文件,獲得document對象            
                SAXReader reader = new SAXReader();
                Document   document = reader.read(new File("input.xml"));
      
      //2.解析XML形式的文本,得到document對象.
                String text = "<members></members>";  
                Document document = DocumentHelper.parseText(text);
      //3.主動創建document對象.
                Document document = DocumentHelper.createDocument();             //創建根節點
                Element root = document.addElement("members");
      

      dom4j 中結點對象的操作:

        //1.獲取文檔的根節點.
      	Element root = document.getRootElement();
      	
        //2.取得某個節點的子節點.
      	Element element=node.element(“書名");
      	
        //3.取得節點的文字
      	String text=node.getText();
        //4.取得某節點下所有名為“member”的子節點,并進行遍歷.
      	List nodes = rootElm.elements("member");
      	for (Iterator it = nodes.iterator(); it.hasNext();) {
      		Element elm = (Element) it.next();
      		// do something
      	}
      	
        //5.對某節點下的所有子節點進行遍歷.
      	for(Iterator it=root.elementIterator();it.hasNext();){
      		Element element = (Element) it.next();
       		// do something
      	}
      	
        //6.在某節點下添加子節點.
      	Element ageElm = newMemberElm.addElement("age");
      	
        //7.設置節點文字.
      	element.setText("29");
      	
        //8.刪除某節點.
      	//childElm是待刪除的節點,parentElm是其父節點
      	parentElm.remove(childElm);
        //9.添加一個CDATA節點.
      	Element contentElm = infoElm.addElement("content");
      	contentElm.addCDATA(diary.getContent());
      

      對節點對象屬性的操作:

        //1.取得某節點下的某屬性
      	Element root=document.getRootElement();
      	//屬性名name
          Attribute attribute=root.attribute("size");
      
        //2.取得屬性的文字
       	String text=attribute.getText();
      
        //3.刪除某屬性
      	Attribute attribute=root.attribute("size");
      	root.remove(attribute);
      	
        //4.遍歷某節點的所有屬性
      	Element root=document.getRootElement(); 
      	for(Iterator it=root.attributeIterator();it.hasNext();){
      		Attribute attribute = (Attribute) it.next();
      		String text=attribute.getText();
      		System.out.println(text);
      	}
        //5.設置某節點的屬性和文字.
      	newMemberElm.addAttribute("name", "sitinspring");
      
        //6.設置屬性的文字
      	Attribute attribute=root.attribute("name");
      	attribute.setText("sitinspring");
      

      在指定位置中插入元素:

      1.得到插入位置的節點列表(list)
      2.調用list.add(index,elemnent),由index決定element的插入位置。
      3.list中存儲的是引用,對list進行了更改,既對document進行了更改
      //Element元素可以通過DocumentHelper對象得到。示例代碼:
      
      Element aaa = DocumentHelper.createElement("aaa");
      aaa.setText("aaa");
      
      List list = root.element("書").elements();
      list.add(1, aaa);
      

      寫入XML文檔

        //1.文檔中全為英文,不設置編碼,直接寫入的形式.
      	XMLWriter writer = new XMLWriter(new  FileWriter("output.xml"));
      	writer.write(document);
      	writer.close();
      
        //2.文檔中含有中文,設置編碼格式寫入的形式.OutputFormat format = OutputFormat.createPrettyPrint();// 指定XML編碼                   
      	format.setEncoding("GBK");
      	XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);
      	writer.write(document);
      	writer.close();
      

      XML與字符串的轉換

        //1.將字符串轉化為XML 
      	String text = "<members> <member>sitinspring</member></members>";
      	Document document = DocumentHelper.parseText(text);
      
        //2.將文檔或節點的XML轉化為字符串.
      	SAXReader reader = new SAXReader();
      	Document   document = reader.read(new File("input.xml"));
      	Element root=document.getRootElement();    
      	String docXmlText=document.asXML();
      	String rootXmlText=root.asXML();
      	Element memberElm=root.element("member");
      	String memberXmlText=memberElm.asXML();
      

      在Dom4j中使用xpath查詢路徑

      xpath路徑表達式就像正則表達式一樣,可以免去自己寫遍歷對比代碼了。

      //dom4j的包中的document..........
      List<Node> list = document.selectNodes("http://xpath");
      

      上面的所有代碼基本上算是模板代碼了,用的時候多看手冊,拷貝粘貼就ok了

      posted on 2011-06-01 20:23  黑暗伯爵  閱讀(875)  評論(0)    收藏  舉報

      導航

      主站蜘蛛池模板: 丰满少妇在线观看网站| 国产不卡一区二区精品| 中文字幕国产精品资源| 激情国产一区二区三区四| 国产在线中文字幕精品| 屁屁影院ccyy备用地址| 变态另类视频一区二区三区| 亚洲一区成人av在线| 国产精品人妻一码二码尿失禁| 亚洲大尺度一区二区三区| 东京热人妻无码一区二区AV| 欧美激情内射喷水高潮| 麻豆一区二区三区香蕉视频 | 激情在线一区二区三区视频| 九九热在线免费播放视频| 中文字幕av无码免费一区| 国产熟女50岁一区二区| 99久久国产综合精品成人影院| AV教师一区高清| 在线播放亚洲成人av| 亚洲人妻一区二区精品| 22222se男人的天堂| 国产亚洲综合区成人国产| 一区二区三区精品视频免费播放| 日日碰狠狠添天天爽| 亚洲精品国产无套在线观| 国产稚嫩高中生呻吟激情在线视频| 亚洲熟妇色xxxxx亚洲| 黄色大全免费看国产精品| 最近中文字幕国产精选| 天天躁久久躁日日躁| gogogo高清在线观看视频中文| 亚洲综合精品成人| 国产成人一区二区三区| 免费播放一区二区三区| 无码国产精品一区二区免费3p| 国产精品中文字幕一区| 蜜桃成熟色综合久久av| 亚洲精品日本久久一区二区三区| 成人啪啪高潮不断观看| 亚洲真人无码永久在线|