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:文章位址
- 四種方式的差別:文章位址