java XML

1、XML:可拓展標記語言。用來描述生活中大量數據之間的關係

例如:<a>

                    <b>

                            <d></d>

                    </b>

                   <c>

                  </c>

            </a>

關係:a下面有bc,b下面有d.


2、XML語法:文檔聲明

<?xml  version="1.0"  encoding="UTF-8"  standalone="yes" ?>

version:版本號

encoding:編碼格式

standalone:是否獨立

(1)元素:標籤,命名規範

(2)屬性

(3)註釋:註釋不能再文檔聲明之前。
(4)<![CDATA[內容]]>:cdata區,直接顯示內容,不進行解析。

(5)命令:<?xml-stylesheet  type="text/css"  herf="01.css"?>


3、XML約束:dtd

<!ELEMENT 書架 (書+)>

<!ELEMENT 書 (書名,作者)>

<!ELEMENT 書名 (#PCDATA)>

<!ELEMENT 作者 (#PCDATA)>


DOCTYPE : 聲明所遵循的DTD文件

<!DOCTYPE 書架 SYSTEM "文件名" >


<!ELEMENT 元素  元素(any enpty)類型或者內容>


<!ATTLIST  元素名

    屬性名   屬性類型(CDATA、枚舉、ID:設置屬性爲唯一值、ENTITY:實體)   設置說明(REQUIERD:必須的、IMPLIED:可選的、FIXED:固定的、默認值)>


引用實體:XML文檔所用的(<!ENTITY  copy  "nihaoya">    -->&copy)

參數實體:用在DTD中(<!ENTITY  %  copy  "nisdlk">    -->  %  copy)


4、XML解析

(1)解析方式分爲dom和sax

(2)調整jvm內存大小:點擊項目的run configuration

(3)jaxp對XML進行dom解析:

     A、讀取XML所有節點

@Test
    public void read() throws Exception{
        //獲取工廠
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //得到dom解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        //獲得文檔
        Document doc = builder.parse("src/book.xml");

        Node node1 = doc.getElementsByTagName("書架").item(0);//獲取書架標籤

        list(node1);
    }

    private void list(Node node1) {
        if(node1 instanceof Element){
            System.out.println(node1.getNodeName());
        }
        NodeList list1 = node1.getChildNodes();
        for(int i=0;i<list1.getLength();i++){
            list(list1.item(i));
        }

    }

B、添加節點

@Test
    public void add() throws Exception{

        //獲取工程
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //得到dom解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        //獲得文檔
        Document doc = builder.parse("src/book.xml");

        Element element = doc.createElement("售價");
        element.setAttribute("nihao", "shiwo");
        element.setTextContent("bbb");
        
        Node node = doc.getElementsByTagName("書").item(0);
        node.appendChild(element);
        //node.insertBefore(newChild, refChild)
        
        //寫回文檔
        TransformerFactory tffactory = TransformerFactory.newInstance();
        Transformer trans =  tffactory.newTransformer();
        trans.transform(new DOMSource(doc), new StreamResult(new FileOutputStream("src/book.xml")));
    }

C、刪除節點

@Test
    public void delete() throws Exception{

        //獲取工程
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //得到dom解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        //獲得文檔
        Document doc = builder.parse("src/book.xml");

        Element ele = (Element) doc.getElementsByTagName("售價").item(0);
        ele.getParentNode().removeChild(ele);
        
        //寫回文檔
        TransformerFactory tffactory = TransformerFactory.newInstance();
        Transformer trans =  tffactory.newTransformer();
        trans.transform(new DOMSource(doc), new StreamResult(new FileOutputStream("src/book.xml")));
    }

(4)jaxp對XML文檔進行sax解析

A、獲取XML文檔內容

@Test
    public void test01() throws Exception{
        //獲取解析工廠
        SAXParserFactory factory = SAXParserFactory.newInstance();
        //獲取解析器
        SAXParser parser = factory.newSAXParser();
        //獲取讀取器
        XMLReader reader = parser.getXMLReader();
        //設置內容讀取器
        reader.setContentHandler(new XMLHandler());
        //讀取XML文檔
        reader.parse("src/book.xml");
    }

//獲取所有標籤

class XMLHandler extends DefaultHandler{
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.println("<"+qName+">");
        for(int i = 0;attributes!=null&&i<attributes.getLength();i++){
            System.out.println(attributes.getQName(i)+"="+attributes.getValue(i));
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        System.out.println("</"+qName+">");
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        System.out.println(new String(ch,start,length));
    }

}


//獲取特定的標籤的處理器
class TagHandler extends DefaultHandler{

    private String current_tag;

    private int num=2;

    private int currentNum;

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        current_tag= qName;

        if("作者".equals(current_tag)){
            currentNum++;
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        current_tag=null;
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if("作者".equals(current_tag)&&currentNum==num){
            System.out.println(new String(ch,start,length));
        }
    }

}


//解析JavaBean的處理器

class BeanHandler extends DefaultHandler{

    private List<Book> list =new ArrayList<Book>();
    private String current_tag;
    private Book book1;
    public List<Book> getList() {
        return list;
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        current_tag=qName;
        if("書".equals(current_tag)){
             book1 = new Book();
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // TODO Auto-generated method stub    
        if("書".equals(qName)){
            list.add(book1);
            book1=null;
        }
        current_tag=null;
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
 
        if("書名".equals(current_tag)){
            book1.setName(new String(ch,start,length));
        }
        if("作者".equals(current_tag)){
            book1.setAuthor(new String(ch,start,length));
        }
        if("價格".equals(current_tag)){
            book1.setPrice(new String(ch,start,length));
        }
    }

}


(5)dom4j對XML進行解析:需要導入包

A、讀取文檔的指定標籤

@Test
    public void read() throws Exception{
        //讀取器
        SAXReader reader = new SAXReader();
        //獲取文檔
        Document document = reader.read("src/book.xml");
        //獲取根節點
        Element ele = document.getRootElement();
        //獲取根節點下面的元素
        Element book = (Element) ele.elements("書").get(1);
        //獲取需要的內容
        String value = book.element("書名").getText();
        System.out.println(value);
    }

B、添加結點

@Test
    public void add() throws Exception{

        SAXReader reader = new SAXReader();
        Document doc = reader.read("src/book.xml");

        Element ele = doc.getRootElement();
        Element book = ele.element("書");
        book.addElement("售價").addAttribute("aaa", "bbbb").addText("2002");

        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");
        
        //寫回
        XMLWriter writer = new XMLWriter( new FileOutputStream( "src/book.xml" ), format );
        writer.write( doc );
        writer.close();
    }


(6)XPath

得到特定的書名下的內容,查看文檔

@Test
    public void test01() throws Exception{
        SAXReader reader = new SAXReader();
        Document doc = reader.read(new File("src/book.xml"));
        
        String value = doc.selectSingleNode("//書名").getText();
        System.out.println(value);
    }


(7)schema

查看w3c文檔


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章