天天看點

JAXP(Java API for XMLProcessing)知識總結XML的解析JAXP解析開發包

XML的解析

1.xml解析方式

DOM方式:Document Object Model,文檔對象模型,W3C推薦的使用方式。

SAX方式:Simple API for XML,不是官方标準,但是屬于開源社群XML-DEV,幾乎所有的XML解析器都支援。

2.xml解析開發包

JAXP:SUN公司推出的解析标準實作。

Dom4J:Dom4J開源社群提供的解析開發包(sun公司的一些技術實作都在使用,使用廣泛)。

JDom:開源組織提供的開發包。

JAXP解析開發包

1.jaxp的api

jaxp是javase的一部分

jaxp解析器主要在javax.xml.parsers包内定義

下分為4個類

dom:
.DocumentBuilder解析器類
    .抽象類
    .該類執行個體可以通過DocumentBuilderFactory.newDocumentBuilder()方法擷取。
    .通過parsers("xml檔案路徑");解析xml檔案,傳回Document整個文檔。
    4.Document為接口,父接口為Node。
    5.Document中的方法getElementsByTagname(String Tagname)可以得到xml中的标簽名,傳回NodeList集合
    6.createElement(String tagname);創造标簽
    7.createTextNode(Strig text);創造文本節點
    8.和js中一樣,可以使用appendChild(Node s); removeChild(Node s); replaceChild(Node new,Node old);方法,具體可以檢視api
    9.NodeList的方法:getLength();得到集合長度。item(int x);傳回在x處的元素,傳回值為Node。

2.DocumentBuilderFactory解析器工廠
    抽象類
    可以通過newInstance擷取執行個體
sax:
.SaxParsers解析器類
.SaxParsersFactory解析器工廠
           

2.jaxp執行個體

1.解析一個xml檔案

xml檔案盒java檔案在同一個包内,my.package

xml檔案(路徑src/my/2.xml),現在需要查詢xml檔案中name标簽的值

<?xml version="1.0" encoding="UTF-8"?>
<person>
    <p1>
        <name>SS1</name>
        <age>20</age>
    </p1>
    <p1>
        <name>SS2</name>
        <age>21</age>
    </p1>
</person>
           

java檔案(路徑src/my/JAXP.java)

package my;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class JAXP {
    public static void main(String args[]) throws Exception
    {
        DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
        DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();

        Document document=documentbuilder.parse("src/my/2.xml");

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

        for(int i=;i<nodelist.getLength();i++)
        {
            System.out.println("name="+nodelist.item(i).getTextContent());//getTextContent()得到标簽裡内容
        }
    }
}
           

運作後得到name标簽的值

通過上例可以看出,想要解析一個xml檔案,并查詢标簽資訊,需要幾個步驟

1.通過DocumentBuilderFactory.newInstance();方法建立DocumentBuilderFactory 對象。

2.通過DocumentBuilderFactory 對象.newDocumentBuilder();方法建立DocumentBuilder 對象。

3.通過DocumentBuilder 對象.parse(“xml檔案路徑”);方法建立Document 對象。

4.通過Document 對象.getElementsByTagName(“标簽名”);方法建立NodeList 對象。

5.通過NodeList 對象.getLength();方法周遊Node元素,并通過NodeList 對象.item(i)方法獲得所需的Node對象,再通過相應方法查詢标簽資訊(比如Node對象.getTextContent()擷取标簽内容)。

2.給xml檔案添加一個标簽

假設實作效果為在1中的xml檔案中每個人的資訊都添加一個

<sex>...</sex>

标簽

xml原檔案(路徑src/my/2.xml)

<?xml version="1.0" encoding="UTF-8"?>
<person>
    <p1>
        <name>SS1</name>
        <age>20</age>
    </p1>
    <p1>
        <name>SS2</name>
        <age>21</age>
    </p1>
</person>
           

java檔案(路徑src/my/JAXP.java)

package my;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class JAXP {
    public static void main(String args[]) throws Exception
    {
        add();
    }

    private static void add() throws Exception{
        DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
        DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();        

        Document document=documentbuilder.parse("src/my/2.xml");

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

        String [] sex={"男","女"};
        for(int i=;i<nodelist.getLength();i++)
        {
            Element s1=document.createElement("sex");
            Text s2=document.createTextNode(sex[i]);

            s1.appendChild(s2);
            nodelist.item(i).appendChild(s1);       
        }

        //因為解析xml的機制是先在記憶體中開辟一塊記憶體,用來存放xml的解析樹,是以現在修改的還隻是記憶體中的xml解析樹,實際上對實際的xml原檔案沒有進行修改,
        //是以需要将記憶體中修改過的xml回寫進檔案,才能實作原檔案的修改
        TransformerFactory transformerfatory=TransformerFactory.newInstance();
        Transformer transformer=transformerfatory.newTransformer();

        transformer.transform(new DOMSource(document), new StreamResult("src/my/2.xml"));
    }
}
           

修改後的xml檔案

<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
    <p1>
        <name>SS1</name>
        <age>20</age>
    <sex>男</sex></p1>
    <p1>
        <name>SS2</name>
        <age>21</age>
    <sex>女</sex></p1>
</person>
           

3.修改xml檔案

将2中添加标簽後的xml檔案的sex标簽内容修改掉

xml修改前(scr/my/2.xml),将sex标簽中的男女值對調

<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
    <p1>
        <name>SS1</name>
        <age>20</age>
    <sex>男</sex></p1>
    <p1>
        <name>SS2</name>
        <age>21</age>
    <sex>女</sex></p1>
</person>
           

java檔案

package my;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class JAXP {
    public static void main(String args[]) throws Exception
    {

        changeSex();
    }

    private static void changeSex() throws Exception{

        DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
        DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();

        Document document=documentbuilder.parse("src/my/2.xml");

        NodeList nodelist=document.getElementsByTagName("sex");

        String [] sex={"女","男"};

        for(int i=;i<nodelist.getLength();i++)
        {
            nodelist.item(i).setTextContent(sex[i]);
        }

        //回寫xml
        TransformerFactory transformerfatory=TransformerFactory.newInstance();
        Transformer transformer=transformerfatory.newTransformer();

        transformer.transform(new DOMSource(document), new StreamResult("src/my/2.xml"));
    }
}
           

修改後的xml檔案

<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
    <p1>
        <name>SS1</name>
        <age>20</age>
    <sex>女</sex></p1>
    <p1>
        <name>SS2</name>
        <age>21</age>
    <sex>男</sex></p1>
</person>
           

4.删除xml中的标簽

将3中的xml檔案中的sex标簽删去

删除前的xml檔案(scr/my/2.xml)

<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
    <p1>
        <name>SS1</name>
        <age>20</age>
    <sex>女</sex></p1>
    <p1>
        <name>SS2</name>
        <age>21</age>
    <sex>男</sex></p1>
</person>
           

java檔案

package my;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class JAXP {
    public static void main(String args[]) throws Exception
    {
        deleteSex();
    }

    private static void deleteSex() throws Exception{

        DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
        DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();

        Document document=documentbuilder.parse("src/my/2.xml");

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


        for(int i=;i<nodelist.getLength();i++)
        {
//          Node parent=nodelist.item(i).getParentNode();
            nodelist.item(i).removeChild(nodelist.item(i).getLastChild());
        }

        //回寫xml
        TransformerFactory transformerfatory=TransformerFactory.newInstance();
        Transformer transformer=transformerfatory.newTransformer();

        transformer.transform(new DOMSource(document), new StreamResult("src/my/2.xml"));
    }

}
           

删除sex标簽的xml檔案

<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
    <p1>
        <name>SS1</name>
        <age>20</age></p1>
    <p1>
        <name>SS2</name>
        <age>21</age>
    </p1>
</person>
           

對xml的元素進行周遊

xml檔案

<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
    <p1>
        <name>SS1</name>
        <age>20</age></p1>
    <p1>
        <name>SS2</name>
        <age>21</age>
    </p1>
</person>
           

java檔案

package my;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class JAXP {
    public static void main(String args[]) throws Exception
    {
        listElement();
    }

    private static void listElement() throws Exception{

        DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
        DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();

        Document document=documentbuilder.parse("src/my/2.xml");


//      Node node=document;
//      NodeList nodelist=node.getChildNodes();//得到一層子節點(在這裡就是xml的根節點了)

        getNode(document,);
    }
    private static void getNode(Node node,int n)
    {
        NodeList nodelist=node.getChildNodes();
        for(int i=;i<nodelist.getLength();i++)
        {
            for(int j=;j<n;j++)
            {
                System.out.print(" ");
            }
            if(nodelist.item(i).getNodeType()==Node.ELEMENT_NODE)
            {
                System.out.println(nodelist.item(i).getNodeName());
                getNode(nodelist.item(i),n+);
            }

        }
    }
}
           

控制台輸出

person
  p1
    name
       age
     p1
    name
       age