文章目录
1 XML解析简介(写到Java代码)
- xml是标记型文档
- JS使用dom解析标记型文档:
|——根据html的层级结构,在内存中分配一个树形结构,把html的标签、属性和文本都封装成对象。
|——document对象、element对象、属性对象、文本对象、Node节点对象 - xml的解析方式(技术):dom和sax
2 JAXP API查看
想要解析xml,首先需要解析器。不同的公司和组织提供了针对dom和sax方式的解析器,通过api的方式提供。sun公司提供了针对dom和sax解析器——jaxp;dom4j组织提供了针对dom和sax解析器—— dom4j(实际开发中使用最多);jdom组织提供了针对dom和sax解析器——jdom。
JAXP的API
|——jaxp是javase的一部分
|——jaxp解析器在jdk的javax.xml.parsers包里面
|————四个类:分别针对dom和sax解析使用的类
|————dom:
|——————DocumentBuilder
:解析器类,这个类是一个抽象类,不能new。此类可以通过DocumentBuilderFactory.newDocumentBuilder()
方法获取。此类中的public Document parse(File f) throws SAXException, IOException
和public Document parse(String uri) throws SAXException,IOException
可以解析xml,返回的是一个Document对象。但是返回的Document对象是一个接口,在包org.w3c.dom
中,父结点是Node,如果在接口Document里面找不到想要的方法,到Node里面去找。
接口public interface Document extends Node
方法摘要
No. | 方法名称 | 方法类型 | 方法解释 |
---|---|---|---|
01 | NodeList getElementsByTagName(String tagname) | 普通方法 | 可以得到标签,返回的是一个集合NodeList |
02 | Element createElement(String tagName) throws DOMException | 普通方法 | 创建标签,返回一个Element对象 |
03 | Text createTextNode(String data) | 普通方法 | 创建文本,返回创建文本对象 |
04 | Node appendChild(Node newChild) throws DOMException | 普通方法 | 把文本添加到标签下面,返回添加节点对象 |
05 | Node removeChild(Node oldChild) throws DOMException | 普通方法 | 删除节点,返回被删除节点对象 |
06 | Node getParentNode() | 普通方法 | 获取父结点 |
接口public interface NodeList
方法摘要
No. | 方法名称 | 方法类型 | 方法解释 |
---|---|---|---|
01 | int getLength() | 普通方法 | 得到集合长度 |
02 | Node item(int index) | 普通方法 | 下标得到具体的值 |
接口public interface Node
方法摘要
No. | 方法名称 | 方法类型 | 方法解释 |
---|---|---|---|
01 | String getTextContent() throws DOMException | 普通方法 | 得到标签里的内容 |
String getTextContent()
throws DOMException
|——————DocumentBuilderFactory
:解析器工厂,这个类也是抽象类,不能new。但是可以使用抽象类里的静态方法newInstance()
获取DocumentBuilderFactory
的实例
|————sax:
|——————SAXParser
:解析器类
|——————SAXParserFactory
:解析器工厂
3 使用JAXP查询节点
<?xml version="1.0" encoding="UTF-8"?>
<person>
<p1>
<name>lks</name>
<age>23</age>
</p1>
<p1>
<name>hhy</name>
<age>20</age>
</p1>
</person>
查询XML中所有元素的值。
(1)创建解析器工厂
(2)根据解析器工厂创建解析器
(3)解析xml返回Document对象
(4)得到所有的name元素
(5)遍历集合,得到每一个name元素
private static void selectAll() throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory docbuilderfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docbuilder = docbuilderfactory.newDocumentBuilder();
Document doc = docbuilder.parse("src/dtdlearn/mydtd00/person.xml");
NodeList nodelist = doc.getElementsByTagName("name");
for(int i = 0; i < nodelist.getLength(); i++) {
Node n = nodelist.item(i);
String str = n.getTextContent();
System.out.println(str);
}
}
4 使用JAXP查询某一节点
查询XML中第一个name元素的值。
(1)创建解析器工厂
(2)根据解析器工厂创建解析器
(3)解析xml返回Document对象
(4)得到所有name元素
(5)使用返回集合里面方法item下标获取具体元素
(6)得到具体的值,使用getTextContent()
private static void searchElement() throws Exception{
DocumentBuilderFactory documentbuilderfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentbuilder = documentbuilderfactory.newDocumentBuilder();
Document document = documentbuilder.parse("src/dtdlearn/mydtd00/person.xml");
NodeList nodelist = document.getElementsByTagName("name");
Node node = nodelist.item(0);
System.out.println(node.getTextContent());
}
5 使用JAXP添加节点
在第一个p1下面添加一个<sex>女</sex>
。
(1)创建解析器工厂
(2)根据解析器工厂创建解析器
(3)解析xml返回Document对象
(4)得到第一个p1,得到所有p1,使用item下标得到
(5)创建sex标签 createElement
(6)创建文本 createTextNode
(7)把文本添加到sex下面 appendChild
(8)把sex添加到第一个p1下面
(9)回写xml transformer
private static void addElement() throws Exception{
DocumentBuilderFactory documentbuilderfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentbuilder = documentbuilderfactory.newDocumentBuilder();
Document document = documentbuilder.parse("src/dtdlearn/mydtd00/person.xml");
NodeList nodelist = document.getElementsByTagName("p1");
Node node = nodelist.item(0);
Node sex = document.createElement("sex");
Text text = document.createTextNode("女");
sex.appendChild(text);
node.appendChild(sex);
TransformerFactory transformerfactory = TransformerFactory.newInstance();
Transformer transformer = transformerfactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/dtdlearn/mydtd00/person.xml"));
}
6 使用JAXP修改节点
修改第一个p1下面的sex内容为男
(1)创建解析器工厂
(2)根据解析器工厂创建解析器
(3)解析xml返回Document对象
(4)得到p1下的sex
(5)修改sex里面的值 setTextContent()
(6)回写xml transformer
public static void modifyElement() throws Exception{
DocumentBuilderFactory documentbuilderfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentbuilder = documentbuilderfactory.newDocumentBuilder();
Document document = documentbuilder.parse("src/dtdlearn/mydtd00/person.xml");
NodeList nodelist = document.getElementsByTagName("sex");
Node node = nodelist.item(0);
node.setTextContent("男");
TransformerFactory transformerfactory = TransformerFactory.newInstance();
Transformer transformer = transformerfactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/dtdlearn/mydtd00/person.xml"));
}
7 使用JAXP删除节点
删除p1下的sex节点。
(1)创建解析器工厂
(2)根据解析器工厂创建解析器
(3)解析xml返回Document对象
(4)获取sex元素
(5)获取sex元素的父结点 getParentNode
(6)借助父节点删除sex节点
(7)回写xml
public static void deleteElement() throws Exception{
DocumentBuilderFactory documentbuilderfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentbuilder = documentbuilderfactory.newDocumentBuilder();
Document document = documentbuilder.parse("src/dtdlearn/mydtd00/person.xml");
NodeList nodelist = document.getElementsByTagName("sex");
Node node = nodelist.item(0);
Node parent = node.getParentNode();
parent.removeChild(node);
TransformerFactory transformerfactory = TransformerFactory.newInstance();
Transformer transformer = transformerfactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/dtdlearn/mydtd00/person.xml"));
}
8 使用JAXP遍历节点
把xml所有名称打印出来。
public static void traverseElement() throws Exception{
DocumentBuilderFactory documentbuilderfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentbuilder = documentbuilderfactory.newDocumentBuilder();
Document document = documentbuilder.parse("src/dtdlearn/mydtd00/person.xml");
list(document.getFirstChild());
}
public static void list(Node node) {
if(node.getNodeType()==Node.ELEMENT_NODE) {
System.out.println(node.getNodeName());
}
NodeList nodelist = node.getChildNodes();
for(int i = 0; i < nodelist.getLength(); i++) {
Node node1 = nodelist.item(i);
list(node1);
}
}