1、JAXP的DOM方式API文档(*****)
2、JAXP的DOM方式操作(查找和添加节点)(*****)
3、JAXP的DOM方式操作(遍历、修改和删除节点)(*****)
====================================================================
1、jaxp的api的查看
** jaxp是javase的一部分 ** jaxp解析器在jdk的javax.xml.parsers包里面 ** 四个类:分别是针对dom和sax解析使用的类 DocumentBuilderFactory、DocumentBuilder、SAXParserFactory、SAXParser *** dom: DocumentBuilderFactory: 解析器工厂 - 这个类是一个抽象类,不能new, newInstance() 获取 DocumentBuilderFactory 的实例。 DocumentBuilder : 解析器类 - 这个类也是一个抽象类,不能new, 此类的实例可以从 DocumentBuilderFactory.newDocumentBuilder() 方法获取 - 一个方法,可以解析xml, parse("xml路径") 返回是 Document 整个文档 - 返回的document是一个接口,父节点是Node,如果在document里面找不到想要的方法,到Node里面去找 在document里面方法 getElementsByTagName(String tagname) -- 这个方法可以得到标签 -- 返回集合 NodeList createElement(String tagName) -- 创建标签 createTextNode(String data) -- 创建文本 appendChild(Node newChild) -- 把文本添加到标签下面 removeChild(Node oldChild) -- 删除节点 getParentNode() -- 获取父节点 NodeList list - getLength() 得到集合的长度 - item(int index)下标取到具体的值 for(int i=0;i<list.getLength();i++) { list.item(i) } Node节点是Document、Element、文本对象、属性对象的父亲。 getTextContent() - 得到标签里面的内容 *** sax: SAXParserFactory: 解析器工厂 SAXParser:解析器类
2、使用jaxp实现查询操作
*** 查询xml中所有的name元素的值 * 步骤 //查询所有name元素的值 1、创建解析器工厂 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 2、根据解析器工厂创建解析器 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); 3、解析器解析xml返回 Document对象 Document document = documentBuilder.parse("src/person.xml"); 4、得到所有的name元素 NodeList nodeList = document.getElementsByTagName("name"); 5、返回集合,遍历集合,得到每一个name元素 - 遍历 getLength()、item() - 得到元素里面值 使用 getTextContent() for(int i=0;i<list.getLength();i++) { Node node = list.item(i); //第i个节点,下标从0开始 String str = node.getTextContent(); //节点里面的值 }
3、使用jaxp添加节点
*** 在第一个p1下面(末尾)添加 <sex>nv</sex> **步骤 1、创建解析器工厂 DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 2、根据解析器工厂创建解析器 DocumentBuilder builder = builderFactory.newDocumentBuilder(); 3、解析xml,返回document Document document = builder.parse("src/person.xml"); 4、得到第一个p1 - 得到所有p1,使用item方法下标得到 NodeList list = document.getElementsByTagName("p1"); Node p1 = list.item(0); 5、创建sex标签 createElement Element sex1 = document.createElement("sex"); 6、创建文本 createTextNode Text text1 = document.createTextNode("nv"); 7、把文本添加到sex下面 appendChild sex1.appendChild(text1); 8、把sex添加到第一个p1下面 p1.appendChild(sex1); 9、回写xml ! 以上修改的都是修改的读到内存中的Document对象,必须回写到硬盘上才能更改! TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
4、使用jaxp修改节点
/* * 1、创建解析器工厂 * 2、根据解析器工厂创建解析器 * 3、解析xml,返回document * 4、得到sex item方法 * 5、修改sex里面的值 setTextContent方法 * 6、回写xml * */ //创建解析器工厂 DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); //创建解析器 DocumentBuilder builder = builderFactory.newDocumentBuilder(); //得到document Document document = builder.parse("src/person.xml"); //得到sex Node sex1 = document.getElementsByTagName("sex").item(0); //修改sex值 sex1.setTextContent("nan"); //回写xml TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
5、使用jaxp删除节点
*** 删除<sex>nan</sex>节点 ** 步骤 /* * 1、创建解析器工厂 * 2、根据解析器工厂创建解析器 * 3、解析xml,返回document * 4、获取sex元素 * 5、获取sex的父节点 * 6、删除使用父节点删除 removeChild方法 * 7、回写xml * */ //创建解析器工厂 DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); //创建解析器 DocumentBuilder builder = builderFactory.newDocumentBuilder(); //得到document Document document = builder.parse("src/person.xml"); //得到sex元素 Node sex1 = document.getElementsByTagName("sex").item(0); //得到sex1父节点 Node p1 = sex1.getParentNode(); //删除操作 p1.removeChild(sex1); //回写xml TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
6、使用jaxp遍历节点
** 把xml中的所有元素名称打印出来 ** 步骤 /* * 1、创建解析器工厂 * 2、根据解析器工厂创建解析器 * 3、解析xml,返回document * ====使用递归实现===== * 4、得到根节点 * 5、得到根节点子节点 * 6、得到根节点子节点的子节点 * */ ** 遍历的方法:递归遍历的方法 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的子节点 //node1.getChildNodes() list1(node1); } }