使用jaxp查询结点
例如:
xml文件为:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<p1>
<name>zhangsan</name>
<age>20</age>
</p1>
<p1>
<name>lisi</name>
<age>22</age>
</p1>
</person>
查询name元素的值
步骤:
- 创建解析器工厂。
- 根据解析器工厂创建解析器。
- 解析xml返回document。
- 得到所有name元素。
- 返回集合,遍历集合,得到每一个name元素的值(得到具体值用getTextContent())。
添加结点
在第一个<p1>下添加结点<sex>
步骤:
- 创建解析器工厂
- 根据解析器工厂创建解析器
- 解析xml,返回document
- 得到第一个p1, 得到所有p1,使用item方法下标得到
- 创建sex标签 createElement
- 创建文本 createTextNode
- 把文本添加到sex下面 appendChild
- 把sex添加到第一个p1下面 appendChild
- 回写xml
修改结点
前三步与之前的相同。
从第四步开始
4. 得到sex item方法
5.修改sex里面的值,setTextContent("修改后的值")方法
6.回写xml
删除结点
4.获取sex元素
5.获取sex的父节点 使用getParentNode方法
6.删除使用父节点删除 removeChild方法
7.回写xml
遍历结点
使用递归实现:1.得到根节点
2.得到根节点子节点
3.得到根节点子节点的子节点
Java代码:
package cn.chaxunjiedian.jaxp;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;
/**
* 实现jaxp查询XMl元素值
* @author Administrator
*
*/
//有些需要导入的包为w3c中的
public class JaxpChaxun_JieDian {
public static void main(String[] args) throws Exception {
// selectAll();//查询结点
// addNode();//添加结点
listElement();//遍历每一个结点
}
private static void listElement() throws Exception {//遍历结点
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();//创建解析工厂
DocumentBuilder builder = builderFactory.newDocumentBuilder();//创建解析器
Document document = builder.parse("E:/eclicpse/javascript/ChaXunJieDian.xml");
list(document);
}
private static void list(Node document) {//递归求所有结点
if(document.getNodeType()==Node.ELEMENT_NODE) {//判断是否为结点类型
System.out.println(document.getNodeName());
}
//得到第一层子节点
NodeList list1 = document.getChildNodes();
for(int i=0;i<list1.getLength();i++) {
Node node1 = list1.item(i);//得到第一层的每一个结点
list(node1);//递归调用
}
}
private static void selectAll() throws Exception {//查询结点
/*查询name元素的值
* 步骤: 1.创建解析器工厂。
* 2.根据解析器工厂创建解析器。
* 3.解析xml返回document。
* 4.得到所有name元素。
* 5.返回集合,遍历集合,得到每一个name元素的值。
*/
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();//创建解析工厂
DocumentBuilder builder = builderFactory.newDocumentBuilder();//创建解析器
Document document = builder.parse("E:/eclicpse/javascript/ChaXunJieDian.xml");
NodeList list = document.getElementsByTagName("name");//得到所有name元素
for(int i=0;i<list.getLength();i++) {
Node name1 = list.item(i);//得到每一个name元素
String str1 = name1.getTextContent();//得到元素的具体的值用getTextContent();
System.out.println(str1);
}
}
public static void addNode() throws Exception {//添加结点
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document document = builder.parse("E:/eclicpse/javascript/ChaXunJieDian.xml");
NodeList list = document.getElementsByTagName("p1");
Node p1 = list.item(0);//得到元素p1
Element sex1 = document.createElement("sex");//创建元素sex
Text text1 = document.createTextNode("nv");//创建文本
sex1.appendChild(text1);//将文本添加到sex元素下
p1.appendChild(sex1);//将sex添加到结点p1上
//返回文字回写xml,如果不反回将在文本中看不到,只是写在内存中了,以后可直接用
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("E:/eclicpse/javascript/ChaXunJieDian.xml"));
}
}