DOM Document Object Model--------文档对象模型
DOM思想:将整个xml加载到内存中,形成文档对象,所有对xml的操作都在内存文档中进行
DOM是官方xml解析标准
DOM是以层级结构组织的节点或信息片段的集合,是xml数据的一种树形表示
文档中所有的元素、属性、文本都会被解析成node节点
DOM解析快速入门
1、创建xml文档books.xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="b001">
<name>java</name>
<price>50</price>
</book>
<book id="b002">
<name>c</name>
<price>20</price>
</book>
</books>
2、使用DOM解析XML文件
将整个xml文档加载到内存中:工厂---解析器---解析加载
3、Document通过 getElementsByTagName 获得 节点集合 NodeList
通过 NodeList 提供 getLength 和 item 遍历 节点集合
对于xml来说,所有的数据都是node节点(元素节点、属性节点、文本节点、注释节点、CDATA节点、文档节点)
node有三个通用API :
getNodeName():返回节点的名称
getNodeType():返回节点的类型
getNodeValue():返回节点的值 ---- 所有元素节点value都是 null
public class DOMTest {
@Test
public void dom1() throws Exception {
// 1、建立DOM解析工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2、建立解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 3、加载xml文件到内存
Document document = builder.parse("books.xml");
NodeList nodeList = document.getElementsByTagName("name");
for (int i = 0; i < nodeList.getLength(); i++) {
Element element = (Element) nodeList.item(i);
System.out.println(element.getNodeName());
System.out.println(element.getNodeValue());
System.out.println(element.getNodeType());
//通过DOM加载内存数据形式解析
System.out.println(element.getFirstChild().getTextContent());
//api解析方式
System.out.println(element.getTextContent());
}
}
}
4、DOM解析查询
@Test
//查询Java书的售价
public void dom2() throws Exception
{
//加载xml到内存
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("books.xml");
//全局查询切入
NodeList nodeList = document.getElementsByTagName("book");
for (int i = 0; i < nodeList.getLength(); i++) {
Element book = (Element) nodeList.item(i);
NodeList children = book.getChildNodes();
Element element = (Element) children.item(1);
if (element.getTextContent().equals("java")) {
//方式一
Element priceElement = (Element) element.getNextSibling().getNextSibling();
System.out.println(priceElement.getTextContent());
//方式二
Element priceElement2 = (Element) children.item(3);
System.out.println(priceElement2.getTextContent());
}
}
}
@Test
//查询Java书的售价 通过id
public void dom3() throws Exception{
//加载xml到内存
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("books.xml");
//直接通过id查找
Element element = document.getElementById("b001");
System.out.println(element);
System.out.println(element.getChildNodes().item(1).getTextContent());
}
5、DOM回写
@Test
//将xml回写到另一个文件
public void dom4() throws Exception{
//加载xml到内存
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("books.xml");
//回写xml用transformer
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(document);
StreamResult result = new StreamResult(new File("books_bak.xml"));
transformer.transform(domSource, result);
}