大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 解析XML

解析XML

更新時間:2021-08-19 11:21:54 來源:動力節(jié)點 瀏覽1002次

什么是XML?有什么用途

1.XML全名為可擴展標記語言(eXtensible Markup Language),是w3c組織的一個技術規(guī)范,具有嚴格的數(shù)據(jù)格式,主要作用是描述數(shù)據(jù)并集中于數(shù)據(jù)的內(nèi)容。

2.XML的主要用途:

(1)作為小型數(shù)據(jù)庫存儲數(shù)據(jù),office軟件貌似就是這么用xml存儲數(shù)據(jù)。

(2)作為配置文件,存儲相關的配置信息,如spring、mybatis等框架的配置文件。

(3)作為傳輸數(shù)據(jù)的載體,如webservice。不過由于xml的數(shù)據(jù)格式冗余太多,沒有json高效簡潔。

XML的文檔格式

1.xml的文檔聲明 :

該聲明不是必需,如果有則會在xml文檔的第一行。 該聲明有三個鍵值對,version表示版本號,encoding表示該文檔使用的字符集編碼,standalone表示是否可以在不讀取其他文件的情況下處理該文檔。

2.xml注釋 :<!-- 注釋內(nèi)容 -->

3.標簽 <標簽><標簽/> 、<標簽/>

(1)標簽區(qū)分大小寫

(2)標簽不能以數(shù)字或下劃線開頭、不能以xml開頭、不能包含空格

(3)標簽中所有的空格和換行都會當作標簽內(nèi)容來處理

4.xml中的轉義字符

5.將內(nèi)容原樣輸出

XML約束

如果一個XML文件的語法符合W3C的規(guī)范,這該XML是一個良好的XML。如果一個良好的XML通過了用戶自定義的DTD和Schema的校驗約束,則稱這個XML為有效的XML。

XML的約束分為兩種,DTD約束和Schema約束

1.DTD約束 : 文檔類型定義(Document Type Definition,簡稱DTD)

(1)DTD的作用

DTD定義了XML文檔內(nèi)容的結構,保證XML以一致的格式存儲數(shù)據(jù)

XML允許用戶為應用程序創(chuàng)建自己的DTD

通過DTD定義的詞匯表以及文檔語法,XML解析器可以檢查XML文檔內(nèi)容的有效性

(2)如何引入DTD

內(nèi)部編寫:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 班級 [
    <!ELEMENT 班級 (學生+)>
    <!ELEMENT 學生 (姓名,性別,年齡)>
    <!ELEMENT 姓名 (#PCDATA)>
    <!ELEMENT 性別 (#PCDATA)>
    <!ELEMENT 年齡 (#PCDATA)>
]>
<班級>
    <學生>
        <姓名>小明</姓名>
        <性別>男</性別>
        <年齡>67</年齡>
    </學生>
    ...
</班級>

外部引入本地約束文件:<!DOCTYPE 文檔根結點 SYSTEM "DTD文件的URL"> 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books SYSTEM "F:/eclipseWorkSpace/testProject/src/testxml/book.dtd">
<books>
    <book id="001" name="紅樓夢">
        <price>10.0</price>
    </book>
    <book id="002" name="三國演義">
        <price>11.0</price>
    </book>
    <book id="003" name="西游記">
        <price>12.0</price>
    </book>
    <book id="004" name="水滸傳">
        <price>13.0</price>
    </book>
</books>
<!--DTD約束文件book.dtd-->
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT books (book)?>
<!ELEMENT book (price)?>
<!ATTLIST book
    id ID #REQUIRED
    name CDATA #REQUIRED
>
<!ELEMENT price (#PCDATA)>

外部引入公共約束文件:<!DOCTYPE 文檔根結點 PUBLIC "DTD名稱" "DTD文件的URL">

java解析XML文件

DOM解析:將XML文件加載進內(nèi)存,構建DOM樹,這樣可以隨意存取和修改文件樹的任何部分,沒有次數(shù)限制,并且易于開發(fā),但不適合大型的XML文件。

SAX解析:類似于流媒體的特點,能夠立即對XML進行分析,而不是等待所有數(shù)據(jù)都加載完成。SAX解析是基于事件的模型,它在解析的過程中可以觸發(fā)一系列的事件,然后激活回調方法進行處理,并且不能對XML進行修改操作。

SAX只能按照順序進行解析,并且占用內(nèi)存較小,適合大型XML文件。

JAXP(Java API for XML Processing,意為XML處理的Java API)是Java XML程序設計的應用程序接口之一,它提供解析和驗證XML文檔的能力。DOM解析和SAX解析是兩種思想,JAXP是java對其的具體實踐。

JDOM 實現(xiàn)了JAVA自己的文檔模型,其效率比JAXP的DOM解析要快,JDOM自身不包含解析器。它通常使用SAX2解析器來解析和驗證輸入XML文檔。JDOM還是要構建DOM樹,所以對超大型XML文件還是不太適合。

DOM4J 是一個非常非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強大和極端易用使用的特點,并且具有更好的性能,同樣也是不適合大型的XML文件。

StAX 是一個基于JAVA API用于解析XML文檔,類似SAX解析器的方式。StAX是PULL API,其中作為SAX是PUSH API。這意味著如果StAX解析器,客戶端應用程序需要詢問StAX解析器從XML獲取信息它所需要的,但如果是SAX解析器,客戶端應用程序需要獲取信息時,SAX解析器會通知客戶端應用程序的信息是可用的。StAX的API可以讀取和寫入XML文檔。

代碼示例:

public class TestJAXP {
    public static void main(String[] args) throws Exception{
        //jaxpDom();
        jaxpSax();
    }    
    public static void jaxpDom() throws Exception{
        //讀取xml文檔
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(new FileInputStream(new File("F:/eclipseWorkSpace/testProject/src/testxml/book.xml")));
        String version = document.getXmlVersion();
        System.out.println(version);
        System.out.println(document.getNodeName());
        Node rootNode = document.getDocumentElement();
        System.out.println(rootNode.getNodeName() + "==" +(rootNode.getNodeType()== Node.ELEMENT_NODE));
        NodeList childNodes = rootNode.getChildNodes();
        int lenght = childNodes.getLength();
        for(int i=0;i<lenght;i++){
            Node childNode = childNodes.item(i);
            if(childNode.getNodeType() == Node.ELEMENT_NODE){
                System.out.println(childNode.getNodeName() +"=="+ childNode.getNodeType());
                System.out.println(childNode.getTextContent());
                NamedNodeMap attributes = childNode.getAttributes();
               for(int j=0 ; j<attributes.getLength();j++){
                   Node attr = attributes.item(j);
                   System.out.println(attr.getNodeName() + "==" + attr.getNodeValue());
               }
            }
        }
        Element book = document.createElement("book");
        book.setAttribute("id", "005");
        book.setAttribute("name", "XXX");
        Element privce = document.createElement("price");
        privce.setTextContent("15.01");
        book.appendChild(privce);
        rootNode.appendChild(book);        
        //輸出xml
        TransformerFactory tFactory = TransformerFactory.newInstance();
        Transformer tf = tFactory.newTransformer();
        tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("F:/eclipseWorkSpace/testProject/src/testxml/book2.xml")));
    }    
    public static void jaxpSax() throws Exception{
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        XMLReader xmlReader = parser.getXMLReader();
        //XMLReader xmlReader = XMLReaderFactory.createXMLReader();//這種方式獲取xmlReader也可以
        xmlReader.setContentHandler(new BookParser());
        xmlReader.parse(new InputSource(new FileInputStream("F:/eclipseWorkSpace/testProject/src/testxml/book2.xml")));
    }
}
class BookParser extends DefaultHandler{
    @Override
    public void startDocument() throws SAXException {
       System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
    }
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        StringBuilder sb = new StringBuilder();
        sb.append("<").append(qName);
        for(int i=0;i<attributes.getLength();i++){
            sb.append(" \"").append(attributes.getLocalName(i)).append("\"=").append(attributes.getValue(i));
        }
        sb.append(">");
        System.out.print(sb);
    }
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        System.out.print("</"+qName+">");
    }
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String cnt = new String(ch,start,length);
        System.out.print(cnt);
    }
}
public class TestDom4J {
    public static void main(String[] args) throws Exception {
        String url = "F:/eclipseWorkSpace/testProject/src/testxml/book3.xml";
        getInfo(url);
        //updateXml(url);
    }    
    @SuppressWarnings("unchecked")
    public static void getInfo(String url) throws DocumentException{
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File(url));
        Element rootNode = document.getRootElement();
        System.out.println(rootNode.getName());
        List<Element> elements = rootNode.elements();
        for(Element n : elements){
            System.out.println(n.getName());
            List<Attribute> attributes = n.attributes();
            for(Attribute attr : attributes){
                System.out.println(attr.getName()+"==="+attr.getValue());
            }
        }
    }    
    public static void updateXml(String url) throws Exception{
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File(url));
        Element rootNode = document.getRootElement();
        Element book = rootNode.addElement("book");
        book.addAttribute("id", "005");
        book.addAttribute("name","封神榜");
        Element price = book.addElement("price");
        price.setText("123.1");        
        OutputFormat format = OutputFormat.createCompactFormat();
        format.setEncoding("UTF-8");
        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(url),format);
        xmlWriter.write(document);
        xmlWriter.close();        
    }
}
public class TestStAX {
    public static void main(String[] args) throws FileNotFoundException, XMLStreamException {
        String url = "F:/eclipseWorkSpace/testProject/src/testxml/book.xml";
        getInfo(url);
    }    
    public static void getInfo(String url) throws FileNotFoundException, XMLStreamException{
        XMLInputFactory factory = XMLInputFactory.newInstance();
        XMLStreamReader reader = factory.createXMLStreamReader(new FileInputStream(url));
        while(reader.hasNext()){
            int event = reader.next();
            if(event == XMLStreamConstants.START_ELEMENT ){
                StringBuilder sb = new StringBuilder();
                sb.append("<").append(reader.getLocalName());
                for(int i=0;i<reader.getAttributeCount();i++){
                    sb.append(" \"").append(reader.getAttributeLocalName(i)).append("\"=").append(reader.getAttributeValue(i));
                }
                sb.append(">");
                System.out.print(sb);
            }            
            if(event == XMLStreamConstants.END_ELEMENT){
                System.out.print("</"+reader.getLocalName()+">");
            }            
            if(event == XMLStreamConstants.CHARACTERS){
                System.out.print(reader.getText());
            }
        }
    }
}

以上就是動力節(jié)點小編介紹的"解析XML",希望對大家有幫助,想了解更多可查看Java在線學習。動力節(jié)點在線學習教程,針對沒有任何Java基礎的讀者學習,讓你從入門到精通,主要介紹了一些Java基礎的核心知識,讓同學們更好更方便的學習和了解Java編程,感興趣的同學可以關注一下。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 国产一区在线视频观看 | 神马影院我不卡在线观看 | www.久久精品 | 成人欧美一区二区三区视频 | 99精品国产第一福利网站 | 在线成人免费视频 | 综合久久久久 | 免费看人做人爱视频拍拍拍 | 国产精品久久免费观看 | 欧美日韩北条麻妃一区二区 | 久国产精品久久精品国产四虎 | 日b黄色 | 欧美精品日日鲁夜夜 | 九九久久精品 | 中文字幕视频免费 | 国产精品久久久久久影视 | 操操操日日 | 欧美午夜性春 | 狠狠色欧美亚洲综合色黑a 狠狠色视频 | 久久综合九色综合网站 | 夜夜夜夜夜夜爽噜噜噜噜噜噜 | 老司机观看精品一区二区 | 永久黄网站色视频免费观看 | 男人午夜免费视频 | 国产二区精品视频 | 国产精品亚洲综合色拍 | 午夜精品aaa国产福利 | 久久影院朴妮唛 | 国产dvd毛片在线视频 | 国产一区二区高清在线 | 精品视频 九九九 | 日韩成人免费一级毛片 | 七七影院九色桃花78 | 国产精品免费视频一区 | 波多野结衣中文无毒不卡 | 福利姬在线视频国产观看 | 激情网站视频 | 欧美一级毛片不卡免费观看 | 色综合亚洲综合网站综合色 | 中文字幕 日韩在线 | 国产丶欧美丶日韩丶不卡影视 |