JAPX(JAVA API for xml)中dom解析思路

来源:互联网 发布:下载地毯设计软件 编辑:程序博客网 时间:2024/05/22 00:35

xml文件

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE persons[  <!ELEMENT persons (person+)>  <!ELEMENT person (name,age,addr)>  <!ELEMENT name (#PCDATA)>  <!ELEMENT age (#PCDATA)>  <!ELEMENT addr (#PCDATA)>  <!ATTLIST  person     id ID #REQUIRED     >    ]><persons><person id="1"><name>小刘</name><age>25</age><addr>兰州交通大学</addr></person><person id="2"><name>小张</name><age>24</age><addr>西北师范大学</addr></person></persons>

解析代码

package com.water.coder;import java.io.File;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Result;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerConfigurationException;import javax.xml.transform.TransformerException;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.junit.Test;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;/** * @author Administrator * JackHall 又称 * WaterCoder 简称wc */public class TestForXmlParse {// 每个函数都是一个测试函数@Testpublic void testDom01() throws ParserConfigurationException, SAXException,IOException {// 建立解析工厂DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();// 建立解析器DocumentBuilder db = dbf.newDocumentBuilder();// 加载文档Document document = db.parse(new File("Person.xml"));// 通过名字获取标签NodeList list = document.getElementsByTagName("name");// 了解No的List和Node的用法,如何遍历for (int i = 0; i < list.getLength(); i++) {Element elem = (Element) list.item(i);// 获取元素的文本内容String text = elem.getTextContent();System.out.println("人名:" + text);}}@Testpublic void testDom02() throws ParserConfigurationException,SAXException, IOException {// Dom解析三步骤:// 1.获取解析工厂// 2.获取解析器// 3.加载文档,并获取文档节点// 4.进行需求的解析DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();Document document = db.parse(new File("Person.xml"));// 解析具体的对象时,一般分为两种办法// 1.通过获取他们的父节点// 2.通过获取他们的兄弟节点//在这里你需要理解一个点:/*<person><name>小刘</name><age>25</age><addr>兰州交通大学</addr>     </person>     person下面的第一个节点为回车换行<name>为第二个节点(访问时item(1))     person下面的第三个节点为回车换行<age>为第四个节点(访问时item(3))     person下面的第四个节点为回车换行<addr>为第五个节点(访问时item(5))*/// 需求1:获取小刘的地址// 1。获取父节点NodeList list = document.getElementsByTagName("person");for (int i = 0; i < list.getLength(); i++) {// 获取本节点Element person = (Element) list.item(i);// 获取子节点NodeList childList = person.getChildNodes();// 下面一般要你了解自己的数据结构// 我的名字存储在person下面的第一个节点Element pName = (Element) childList.item(1);// 如果名字等于你要查找的名字if (pName.getTextContent().equals("小刘")) {// 地址存放在Person下的第5个Element pAddr = (Element) childList.item(5);System.out.println("小刘的地址为" + pAddr.getTextContent());}}// 需求2:获取小张的年龄NodeList pNameList = document.getElementsByTagName("name");for(int i = 0;i<pNameList.getLength();i++){//获取对应的姓名节点Element pName = (Element)pNameList.item(i);//判断if(pName.getTextContent().equals("小张")){//找到节点后//因为节点与节点之间相聚比较多,使用函数封装一下,否则代码看起来不整洁Element pAge = getPAddr(pName);System.out.println("小张的年龄"+pAge.getTextContent());}}}//获取这个结构中的年龄节点public Element getPAddr(Element pName){//getNextSibling获取下一个节点,和上面的一样有文本节点和元素节点Element pAge = (Element)pName.getNextSibling().getNextSibling();return pAge;}@Testpublic void testDom03() throws ParserConfigurationException, SAXException, IOException{DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();Document document = db.parse(new File("Person.xml"));//获取节点通过getElementById();//ID是文档约束,不仅仅是属性而已//如果只是属性那么下面获取的就是空指针了Element eml = document.getElementById("1");if(eml!=null){System.out.println(eml.getNextSibling().getNextSibling().getTextContent());}}@Testpublic void testDom04() throws ParserConfigurationException, SAXException, IOException, TransformerException{DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();Document doc = db.parse(new File("Person.xml"));TransformerFactory tff = TransformerFactory.newInstance();Transformer tf = tff.newTransformer();DOMSource domSource = new DOMSource(doc);StreamResult sr = new StreamResult(new File("Person_bak.xml"));tf.transform(domSource, sr);}}


0 0
原创粉丝点击