使用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")); } }