java web 學習第十一天——XML

Day 11

Jaxp解析器在jdk的javax.xml.parsers包裏面

使用Jaxp實現查詢操作

Person.xml

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

<person>

    <p1>

        <name>zhangsan</name>

        <age>20</age>

    </p1>

    <p1>

        <name>zhangsan</name>

        <age>20</age>

    </p1>

</person>

TestJxap.java

  //目的查詢所有name元素的值

        //1創建解析器工廠

        DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();

        //根據解析器工廠創建解析器

         DocumentBuilder builer= builderFactory.newDocumentBuilder();

        //根據xml返回document

         Document document=builer.parse("src/person.xml");

        //得到name元素

         NodeList list=document.getElementsByTagName("name");

        //遍歷

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

         Node name1= list.item(i);//得到每一個元素

         //得到每一個元素的值

        Strings= name1.getTextContent();

        System.out.println(s);

        }

使用jaxp添加節點

目標題目:在第一個P1下面添加一個性別女

publicstaticvoid AddSex() throws ParserConfigurationException,SAXException, IOException, TransformerException {

            //創建解析器工廠

            DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();

            //創建解析器

            DocumentBuilder builder = builderFactory.newDocumentBuilder();

            //得到document

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

            //得到p1

            NodeList list = document.getElementsByTagName("p1");

            //得到第一個p1

           Node list1 = list.item(0);

           //創建標籤

           Element sex1 = document.createElement("sex");

            //創建文本

           Text text1 = document.createTextNode("nv");

           //添加文本到標籤下

           sex1.appendChild(text1);

           //sex1添加到p1

           list1.appendChild(sex1);

           //會寫xml

           TransformerFactory transformerfactory= TransformerFactory.newInstance();

           Transformer  trand = transformerfactory.newTransformer();

           trand.transform(new DOMSource(document), new javax.xml.transform.stream.StreamResult("src/person.xml"));

        }

注意:在添加完畢之後,元素不會添加到文件中,只會添加內存中,這時需要使用方法回寫。

 

使用jaxp 修改節點

 修改第一個P1下面的sex的內容是男:

publicstaticvoid update() throws ParserConfigurationException,SAXException, IOException, TransformerException {

        //修改第一個P1裏面的值爲男

        //創建解析器工廠

        DocumentBuilderFactory document1 = DocumentBuilderFactory.newInstance();

        //創建解析器

        DocumentBuilder document = document1.newDocumentBuilder();

        //創建document

        Document docu = document.parse("src/person.xml");

        //得到P1

        Node list = docu.getElementsByTagName("sex").item(0);

       

        //修改

        list.setTextContent("nan");

        //回寫xml

        TransformerFactory trans= TransformerFactory.newInstance();

        Transformer tran = trans.newTransformer();

        tran.transform(new DOMSource((docu)), new javax.xml.transform.stream.StreamResult("src/person.xml"));}

刪除sex

publicstaticvoid deny() throws ParserConfigurationException,SAXException, IOException, TransformerException {

        //創建解析器工廠

        DocumentBuilderFactory document1 = DocumentBuilderFactory.newInstance();

        //創建解析器

        DocumentBuilder document = document1.newDocumentBuilder();

        //創建document

        Document docu = document.parse("src/person.xml");

        //得到sex

        Node sex1 = docu.getElementsByTagName("sex").item(0);

        //得到sex的父節點

        Node p1 =sex1.getParentNode();

        //刪除

        p1.removeChild(sex1);

        //回寫

        TransformerFactory trans = TransformerFactory.newInstance();

        Transformer tran = trans.newTransformer();

        tran.transform(new DOMSource((docu)), new javax.xml.transform.stream.StreamResult("src/person.xml"));

        }

使用jaxp遍歷節點

把所有的元素的名稱都打印出來

注意:遍歷之後打印出來的會有空格等其他的內容,需要先判斷是否是元素

publicstaticvoid listElement() throwsException{

        //創建解析器工廠

        DocumentBuilderFactory document1 = DocumentBuilderFactory.newInstance();

        //創建解析器

        DocumentBuilder document = document1.newDocumentBuilder();

        //創建document

        Document docu = document.parse("src/person.xml");

        //編寫一個遞歸方法實現遍歷操作

        list1(docu);

        }

        //遞歸遍歷

        privatestaticvoid list1(Node node) {

        //判斷是元素類型的時候纔打印

        if(node.getNodeType()==Node.ELEMENT_NODE) {

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

        }

        //得到一層子節點

        NodeList list = node.getChildNodes();

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

             //得到每一個節點

             Node node1 = list.item(i);

            list1(node1);

        }

        }

Xml的schema約束

det約束語法:<! ELEMENT 元素名稱 約束>

**schema符合xml的語法規範,一個xml中可以有多個schema,多個schema使用名稱空間來進行區分(類似於包名),dtd裏面有PCTATA類型,但是schema中可以支持更多的數據類型,比如 年齡 只能是整數,在schema可以直接定義一個整數類型,語法更加的複雜。

 

schema的快速入門:

  創建一個schema文件:後綴值 .xsd

在schema裏面有屬性 xmlns=http://www.w3.org/2001/XMLSchema

                    表示xml文件是約束文件

targetNamespace=http://www.example.org/1

使用schema約束直接通過這個地址引入約束文件

elementFormDefault="qualified"

表示質量良好的

步驟:1,看xml文件只中有多少個元素就寫多少個<element>

<element name="person">//複雜元素

 

             <complexType>

                  <sequence>

                      <element name="name"type="string"></element>簡單

                         <element name="age"type="int"></element>   簡單元素

                  </sequence>

             </complexType>

 </element>

在被約束文件中引入

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

<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://www.example.org/1"

xsi:xsi:schemaLocation="http://www.example.org/1  1.xsd">

 

xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance

表示xml是一個被約束的文件

xmlns="http://www.example.org/1"

約束文檔裏面的targetNamespace的值

引入的文件名

targetNamespace的值

xsi:schemaLocation="http://www.example.org/1  1.xsd">

 

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