1、jaxp解析器api的查看
jaxp解析器在jdk的javax.xml.parsers包里 四个类:分别针对dom和sax解析使用的类 针对dom类: DocumentBuilderFactory:解析器工厂 抽象类,不能new 需要用newInstance() 获取 DocumentBuilderFactory的实例 DocumentBuileder: 解析器类 抽象类,不能new。 需要从DocumentBuilederFactory.newDocumentBuilder(); 方法中得到 方法: parse(url)/parse(File f); 可以解析xml,返回Document文档 返回的是一个接口,父节点是Node NodeList.item(index) 取下标具体的值,可以通过此方法遍历节点集合 .getTextContent(); 得到元素里的值 针对sax类: SAXParsers: 解析器类 SAXParsersFactory: 解析器工厂
2、使用jaxp实现查询操作
查询xml中所有name元素的值
步骤: 1.创建解析器工厂 // DocumentBuilderFactory.newInstance(); 2.根据解析器工厂创建解析器 //.newDocumentBuilder(); 3.解析xml返回document //.parse("src/person.xml"); 4.得到所有的name元素 //.getElementsByTagName("name"); 5.遍历元素节点集合 //.getLength(); 6.得到每一个name元素节点 //.item(i); 7.得到元素里的值 //.getTextContent();
private static void selectAll() throws Exception {
// 1.创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory
.newInstance();
// 2.根据解析器工厂创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
// 3.解析xml返回document
Document document = builder.parse("src/person.xml");
// 得到所有的name元素
NodeList list = document.getElementsByTagName("name");
// 遍历元素节点集合
for (int i = 0; i < list.getLength(); i++) {
Node name1 = list.item(i); // 得到每一个name元素节点
// 得到元素里的值
String s = name1.getTextContent();
System.out.println(s);
}
}
3、使用jaxp添加节点
在第一个p1标签末尾后添加sex
步骤: 1.创建解析器工厂 // DocumentBuilderFactory.newInstance(); 2.根据解析器工厂创建解析器 //.newDocumentBuilder(); 3.解析xml返回document //.parse("src/person.xml"); 4.得到第一个<p1> //.getElementsByTagName("p1"); // .item(0); 5.创建sex元素 //.createElement() 6.创建文本 //.createTextNode() 7.将文本添加到<sex>中 .appendChild() 8.将<sex>添加到<p>后 .appendChild() *****此时只是添加到内存中,还未回写到xml文件中 回写方法: transform(new DOMsource(document), new StreamResult("xml文件路径")) 9.创建回写工厂 //TransformerFactory transformerFactory = TransformerFactory.newInstance(); 10. 通过回写工厂创建回写类 //Transformer transformer = transformerFactory.newTransformer(); 11.通过回写类调用回写方法 // .transform(new DOMsource(document), new StreamResult("xml文件路径"))
private static void addSexEle() throws Exception {
// 1.创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory
.newInstance();
// 2.根据解析器工厂创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
// 3.解析xml返回document
Document document = builder.parse("src/person.xml");
// 得到p1
NodeList list = document.getElementsByTagName("p1");
Node p1 = list.item(0);
// 创建sex元素 .createElement()
Element sex1 = document.createElement("sex");
// 创建文本 .createTextNode()
Text text1 = document.createTextNode("man");
// 将文本添加到sex中 .appendChild()
sex1.appendChild(text1);
// 将sex添加到<p>后 .appendChild()
p1.appendChild(sex1);
// 此时只是添加到内存中,还未回写到xml文件中
// 回写方法 transform(new DOMsource(document), new StreamResult("xml文件路径"))
//创建回写工厂
TransformerFactory transformerFactory = TransformerFactory
.newInstance();
//通过回写工厂创建回写类
Transformer transformer = transformerFactory.newTransformer();
//通过回写类调用回写方法
transformer.transform(new DOMSource(document), new StreamResult(
"src/person.xml"));
}
4、使用jaxp修改节点
修改第一个p1标签的sex的文本 为 women
步骤: 1.创建解析器工厂 // DocumentBuilderFactory.newInstance(); 2.根据解析器工厂创建解析器 //.newDocumentBuilder(); 3.解析xml返回document //.parse("src/person.xml"); 4.得到第一个 <sex> 节点 Node sex1 = document.getElementsByTagName("sex").item(0) 5.修改属性值为"women" //sex1.setTextContent("women"); 6.回写到xml
private static void modifySex() throws Exception {
// 1.创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory
.newInstance();
// 2.根据解析器工厂创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
// 3.解析xml返回document
Document document = builder.parse("src/person.xml");
// 得到sex
Node sex1 = document.getElementsByTagName("sex").item(0);
// 修改sex属性值
sex1.setTextContent("women");
// 回写
TransformerFactory transformerFactory = TransformerFactory
.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult(
"src/person.xml"));
}
5、使用jaxp删除节点
删除第一个p1标签的sex元素
步驟: 1.创建解析器工厂 // DocumentBuilderFactory.newInstance(); 2.根据解析器工厂创建解析器 //.newDocumentBuilder(); 3.解析xml返回document //.parse("src/person.xml"); 4.得到sex Node sex1 = document.getElementsByTagName("sex").item(0); 5.获取sex父节点 //.getParentNode(); 6.使用父节点删除sex // .removeChild(sex1); 7.回写到xml
private static void delSex() throws Exception {
// 1.创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory
.newInstance();
// 2.根据解析器工厂创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
// 3.解析xml返回document
Document document = builder.parse("src/person.xml");
// 得到sex
Node sex1 = document.getElementsByTagName("sex").item(0);
// 获取sex父节点
Node p = sex1.getParentNode();
// 使用父节点删除sex
p.removeChild(sex1);
// 回写
TransformerFactory transformerFactory = TransformerFactory
.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult(
"src/person.xml"));
}
6、使用jaxp遍历节点
打印出文档中所有元素名称
步骤:
1.创建解析器工厂 // DocumentBuilderFactory.newInstance();
2.根据解析器工厂创建解析器 //.newDocumentBuilder();
3.解析xml返回document //.parse("src/person.xml");
4.使用递归实现 节点遍历
private static void list1(Node node) {
//判断是否为元素 只打印元素 防止系统打印出 缩进(空格换行)
if(node.getNodeType() == node.ELEMENT_NODE )
System.out.println(node.getNodeName());
//得到第一层节点集合
NodeList list = node.getChildNodes();
//遍历第一层节点
for(int i=0 ; i<list.getLength();i++){
//得到第一层每一个节点
Node node1 = list.item(i);
//得到node1的子节点
list1(node1);
}
private static void listElement() throws Exception {
// 1.创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory
.newInstance();
// 2.根据解析器工厂创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
// 3.解析xml返回document
Document document = builder.parse("src/person.xml");
//=====使用递归实现 节点遍历
//4.得到根节点
//5.得到根节点的子节点
//6.得到根节点子节点的子节点....
list1(document);
}
private static void list1(Node node) {
if(node.getNodeType() == node.ELEMENT_NODE )
System.out.println(node.getNodeName());
//得到第一层节点
NodeList list = node.getChildNodes();
//遍历list
for(int i=0 ; i<list.getLength();i++){
//得到第一层每一个节点
Node node1 = list.item(i);
//得到node1的子节点
list1(node1);
}
}