天天看點

JAVA SE 讀寫XML——DOM

DOM

主要用的的類

  • Document:接口
  • DocumentBuilder:
  • DocumentBuilderFactory:

Document接口

常用方法

  • Attr createAttribute(String name) //建立給定名稱的屬性
  • Attr createAttributeNS(String namespaceURI, String qualifiedName) //建立給定的限定名稱和名稱空間 URI 的屬性
  • DocumentFragment createDocumentFragment() //建立空 DocumentFragment 對象
  • Element createElement(String tagName) //建立指定類型的子節點
  • Element createElementNS(String namespaceURI, String qualifiedName) //建立給定的限定名稱和名稱空間 URI 的元素
  • Text createTextNode(String data) //建立給定指定字元串的 Text 節點
  • Element getDocumentElement() //該屬性允許直接通路文檔的文檔元素的子節點。
  • Element getElementById(String elementId) //傳回具有帶給定值的 ID 屬性的 Element
  • Node renameNode(Node n, String namespaceURI, String qualifiedName) //重命名 ELEMENT_NODE 或 ATTRIBUTE_NODE 類型的現有節點

DocumentBuilder類:

定義 API, 使其從 XML 文檔擷取 DOM 文檔執行個體

構造方法

  • DocumentBuilder()

常用方法

  • abstract boolean isValidating() //訓示此解析器是否被配置為驗證 XML 文檔
  • abstract Document newDocument() //擷取 DOM Document 對象的一個新執行個體來生成一個 DOM 樹
  • Document parse(File f) //将給定檔案的内容解析為一個 XML 文檔,并且傳回一個新的 DOM Document 對象
  • Document parse(InputStream is) //将給定 InputStream 的内容解析為一個 XML 文檔,并且傳回一個新的 DOM Document 對象
  • Document parse(InputStream is, String systemId) //将給定 InputStream 的内容解析為一個 XML 文檔,并且傳回一個新的 DOM Document 對象
  • Document parse(String uri) //将給定 URI 的内容解析為一個 XML 文檔,并且傳回一個新的 DOM Document 對象
  • void reset() //将此 DocumentBuilder 重置為其原始配置
  • abstract void setEntityResolver(EntityResolver er) 指定使用 EntityResolver 解析要解析的 XML 文檔中存在的實體

DocumentBuilderFactory類

定義工廠 API,使應用程式能夠從 XML 文檔擷取生成 DOM 對象樹的解析器

構造方法

  • DocumentBuilderFactory() //用于阻止執行個體化的受保護構造方法

常用方法

  • abstract Object getAttribute(String name) //允許使用者在底層實作上檢索特定屬性
  • abstract DocumentBuilder newDocumentBuilder() //使用目前配置的參數建立一個新的 DocumentBuilder 執行個體。
  • static DocumentBuilderFactory newInstance() //擷取 DocumentBuilderFactory 的新執行個體。
  • static DocumentBuilderFactory newInstance(String factoryClassName, ClassLoader classLoader) //從類名稱中擷取新的 DocumentBuilderFactory 執行個體
  • abstract void setAttribute(String name, Object value) //允許使用者在底層實作上設定特定屬性
  • void setCoalescing(boolean coalescing) //指定由此代碼生成的解析器将把 CDATA 節點轉換為 Text 節點,并将其附加到相鄰(如果有)的 Text 節點。
  • void setExpandEntityReferences(boolean expandEntityRef) //指定由此代碼生成的解析器将擴充實體引用節點。
  • abstract void setFeature(String name, boolean value) //設定由此工廠建立的此 DocumentBuilderFactory 和 DocumentBuilder 的功能。
  • void setIgnoringComments(boolean ignoreComments) //指定由此代碼生成的解析器将忽略注釋。
  • void setIgnoringElementContentWhitespace(boolean whitespace) //由此工廠建立的解析器在解析 XML 文檔時,必須删除元素内容中的空格(有時也可以稱作“可忽略空格”,請參閱 XML Rec 2.10)。
  • void setNamespaceAware(boolean awareness) //指定由此代碼生成的解析器将提供對 XML 名稱空間的支援。
  • void setSchema(Schema schema) //設定将由解析器使用的 Schema,該解析器從此工廠建立。
  • void setValidating(boolean validating) //指定由此代碼生成的解析器将驗證被解析的文檔。
  • void setXIncludeAware(boolean state) //設定 XInclude 處理的狀态

 執行個體應用

//讀取xml

package TESTXML;

import org.w3c.dom.*;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.IOException;

public class testDom {
    public static void main(String[] args) {
        textDom test = new textDom();
        test.createXml();
    }
    
    //建立指定檔案
    public DocumentBuilder getDocumentBuilder() {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = null;
        try {
            db = dbf.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
        return db;
    }

    //解析xml檔案
    public void xmlParser() {
        try {
            Document document = getDocumentBuilder().parse("books.xml");
            NodeList booklist = document.getElementsByTagName("book");

            //1、未知類型,擷取屬性名,屬性值
            for (int i = 0; i < booklist.getLength(); i++) {
                Node book = booklist.item(i);
                NamedNodeMap attrs = book.getAttributes();
                System.out.println("————————第" + (i + 1) + "本書———————");
                for (int j = 0; j < attrs.getLength(); j++) {
                    Node attr = attrs.item(j);
                    System.out.println("| 屬性名: " + attr.getNodeName());
                    System.out.println("| 屬性值: " + attr.getNodeValue());

                }
            }

            //2、已知存在book節點,擷取id屬性值
            for (int i = 0; i < booklist.getLength(); i++) {
                Element book = (Element) booklist.item(i);//知道有這個id類型
                String attrValue = book.getAttribute("id");
                System.out.println("id的屬性值:" + attrValue);
            }

            //3、擷取節點名、節點值
            for (int i = 0; i < booklist.getLength(); i++) {
                Node book = booklist.item(i);
                NodeList childNodes = book.getChildNodes();
                System.out.println("——————第" + (i + 1) + "本書共有" 
                    + childNodes.getLength() + "子節點——————");//換行和空格也算
                for (int k = 0; k < childNodes.getLength(); k++) {
                    //擷取element類型的節點名
                    if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
                        System.out.print("第" + (k + 1) + "個節點名:" 
                            + childNodes.item(k).getNodeName() + "  節點值是:");
                        System.out.println(childNodes.item(k).getFirstChild().getTextContent());//繼續擷取子節點
                    }
                }
            }
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //生成xml檔案
    public void createXml() {
        DocumentBuilder db = getDocumentBuilder();
        Document document = db.newDocument();
        //document.setXmlStandalone(true);//去掉standalone
        Element bookstore = document.createElement("bookStore");
        Element book = document.createElement("book");//建立節點
        Element name = document.createElement("name");
        book.appendChild(name);//添加子節點
        name.setTextContent("max");//設定文本内容
        book.setAttribute("id", "1");//設定節點屬性
        bookstore.appendChild(book);
        document.appendChild(bookstore);

        TransformerFactory tff = TransformerFactory.newInstance();
        try {
            Transformer tf = tff.newTransformer();
            tf.setOutputProperty(OutputKeys.INDENT, "yes");//設定輸入格式換行
            tf.transform(new DOMSource(document), new StreamResult(new File("book.xml")));
        } catch (TransformerException e) {
            e.printStackTrace();
        }
    }
}
           

相關文章——讀寫xml系列方式

  • SAX:文章位址
  • JDOM:文章位址
  • DOM4J:文章位址
  • 四種方式的差別:文章位址