javawebXML及Jaxp解析XML


XMLExtensible Markup Language):可擴展標記語言,w3c組織發佈,目前遵循2000年發佈的XML1.0規範!

XML文件分爲:文檔聲明、元素、屬性、註釋、CDATA區、特殊字符、處理指令

processing introduction

文檔聲明:<?xml version=”1.0” encoding=”GB2312” standalone=”yes”?>

                standalone說明文檔是否獨立。

XML元素:XML文件中出現的標籤,一個標籤分爲開始標籤和結束標籤。

格式良好的XML文檔必須有且僅有一個根標籤,其他標籤都是這個根標籤的子孫標籤。

一個XML元素可以包含字母、數字以及其他一些可見字符,但必須遵守:

1、  區分大小寫

2、  不能以數字或“_”(下劃線)開頭

3、  不能以xmlXMLXml開頭

4、  不能包含空格

5、  名稱中間不能包含(:)

Tip:屬性

Xml文件註釋:“<!—註釋-->

TipCDATA區:在編寫XML文件時,有些內容可能不想讓解析引擎解析執行,而是當做原始內容處理,可以把這些內容放在CDATA區裏,對於CDATA區的內容,XML解析引擎不會處理,而是原封不動的輸出。

語法:<![CDATA[內容]]>

Tip:轉義字符:

&&amp)、<(&it)>(&gt)”(&quot)’(&apos)

Tip:處理指令:簡稱PIprocessing introduction),用來指揮解析引擎如何解析XML文檔內容。

如:<?xml-stylesheet type=”text/css” href=”1.css”?>---通知解析引擎,應用css文件顯示xml文檔內容。

XML聲明語句就是最常見的一種處理指令。

TipXML約束:在XML技術裏,可以編寫一個文檔來約束一個XML文檔的書寫規範,這稱之爲XML約束。

常用的約束技術:XML DTDDocument Type Definition,文檔類型定義)、XML Schema

檢查DTD正確性:可以直接用eclipse校驗。

XML編程(C--create  R—read  U—update  D—delete):

XML解析方式有兩種:domDocument Object Model—文檔對象模型,適合增刪改查,耗內存)、saxSimple API for XML,佔用內存少,解析速度快,只適合做文檔的讀取,不適合增刪改查)

XML解析開發包:JaxpSUN)、Jdomdom4j

調整JVM內存大小:JVM的初始內存大小是64M,超過則內存溢出

調整方式爲:啓動時在jvmarguments里加上(-Xml80m)à即在內存開闢了80M的空間

 

使用JaxpXML文檔進行dom解析:

1、  創建工廠

2、  得到dom解析器

3、  解析XML文檔,得到代表文檔的document

    publicvoid test()throws ParserConfigurationException, SAXException, IOException{

       //打印XML中的所有標籤

       DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

       DocumentBuilder builder=factory.newDocumentBuilder();

       Document document=builder.parse("src/book.xml");

       Node root=document.getElementsByTagName("書架").item(0);

       list(root);

    }

    privatevoid list(Node root) {

       if(rootinstanceof Element){

          System.out.println(root.getNodeName());

       }

       NodeList list=root.getChildNodes();

       for(int i=0;i<list.getLength();i++){

          Node child=list.item(i);

          list(child);

       }

    }

}

    @Test//XML文檔中添加節點:<售價>59.00</售價>

    publicvoid add()throws SAXException, IOException, ParserConfigurationException, TransformerException{

       DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

       DocumentBuilder builder=factory.newDocumentBuilder();

       Document document=builder.parse("src/book.xml");

      

       //創建節點

       Element price= document.createElement("售價");

       price.setTextContent("59.00");

      

       //把創建的節點掛在第一本書上

       Element book=(Element) document.getElementsByTagName("").item(0);

       book.appendChild(price);

      

       //把更新後內存寫回XML文檔

       TransformerFactory tffactory=TransformerFactory.newInstance();

       Transformer tf=tffactory.newTransformer();

       tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));

    }

   

   

    //向文檔中指定位置添加節點

    @Test

    publicvoid test2()throws ParserConfigurationException, SAXException, IOException, TransformerException{

       DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

       DocumentBuilder builder=factory.newDocumentBuilder();

       Document document=builder.parse("src/book.xml");

       //創建節點

       Element price=document.createElement("售價");

       price.setTextContent("59.00");

       //得到參考節點

       Element refNode=(Element) document.getElementsByTagName("售價").item(0);

       //得到要懸掛的節點

       Element book=(Element) document.getElementsByTagName("").item(0);

       //往節點指定位置插崽

       book.insertBefore(price, refNode);

       //把更新後內存寫回XML文檔

             TransformerFactory tffactory=TransformerFactory.newInstance();

             Transformer tf=tffactory.newTransformer();

             tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));

    }

/* 

    節點上添加屬性

    Element bookName=(Element)document.getElementsByTagName("書名").item(0);

    bookName.setAttribute("name","XXXXX");*/

   

/*  刪除節點

    得到要刪除的節點

    Element e=(Element)document.getElementBytagName("售價").item(0);

    得到要刪除節點的爸爸,再刪除兒子節點

    e.getParentNode().removeChild(e);*/

   

/*  更新

    Element e=(Element)document.getElementByTagName("售價").item(0);

    e.setTexttextContent("109");*/

   

   

}

SAX解析(JAXP):

    publicstaticvoid main(String[] args)throws ParserConfigurationException, SAXException, IOException{

       //獲得解析工廠

       SAXParserFactory factory= SAXParserFactory.newInstance();

       //得到解析器

       SAXParser sp=factory.newSAXParser();

       //得到讀取器

       XMLReader reader=sp.getXMLReader();

       //設置內容處理器(implementsContenthandlerextends DefaultHandler)

       reader.setContentHandler( );

       //讀取XML文檔內容

       reader.parse("src/book.xml");

    }

}

開發中所用方法:

XML

<?xmlversion="1.0"encoding="UTF-8"standalone="no"?><書架>

    <>

       <書名 name="XXXXX">Java就業培訓教程</書名>

       <作者>張孝祥</作者>

       <售價>59.00</售價>

        <售價>109</售價>

    <售價>59.00</售價></>

    <>

       <書名>JavaScript網頁開發</書名>

       <作者>張孝祥</作者>

       <售價>28.00</售價>

    </>

</書架>

 

    publicstaticvoid main(String[] args) {

       // 獲得解析工廠

       SAXParserFactory factory = SAXParserFactory.newInstance();

       // 得到解析器

       SAXParser sp = factory.newSAXParser();

       // 得到讀取器

       XMLReader reader = sp.getXMLReader();

       // 設置內容處理器(implementsContenthandlerextends DefaultHandler)

       reader.setContentHandler();

       // 讀取XML文檔內容

       reader.parse("src/book.xml");

       // XML文檔中的每一本書封裝到一個book對象,並把多個book對象放在一個list集合返回

       class BeanListHandlerextends DefaultHandler {

          privateListlist =newArrayList();

          private StringcurrentTag;

          private Bookbook;

 

          @Override

          publicvoid startElement(String uri, String localName, String name,

                 Attributes attributes)throws SAXException {

             //TODO Auto-generated method stub

             currentTag = name;

             if ("".equals(currentTag)) {

                 book =new Book();

             }

 

          }

 

          @Override

          publicvoid characters(char[] ch,int start,int length)

                 throws SAXException {

             if ("書名".equals(currentTag)) {

                 String name =new String(ch, start, length);

                 book.setName(name);

             }

             if ("作者".equals(currentTag)) {

                 String author =new String(ch, start, length);

                 book.setAuthor(author);

             }

             if ("售價".equals(currentTag)) {

                 String price =new String(ch, start, length);

                 book.setAuthor(price);

             }

          }

 

          @Override

          publicvoid endElement(String uri, String localName, String qName)

                 throws SAXException {

             if (name.equals("")) {

                  list.add(book);

                 book =null;

             }

             currentTag =null;

          }

          publicList getList(){

             returnlist;

          }

       }

 


發佈了59 篇原創文章 · 獲贊 95 · 訪問量 59萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章