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系列方式