Jaxp的dom操作

  Jaxp是sun公司提供的针对dom和sax的解析器,同时jaxp也是JavaSE的一部分,在JDK的javax.xml.parsers包里,对dom有DocumentBuilder类和DocumentBuilderFactory类。
  

一、DocumentBuilder类


  1、DocumentBuilder类是dom解析器类,同时也是 抽象类不可以通过new来获取该类实例,而是通过DocumentBuilderFactory.newDocumentBuilder()来获取实例
  
  2、解析xml方法:

  parse("xml路径") 

返回是 Document 整个文档, 返回的document是一个接口,父节点是Node,如果在document里面找不到想要的方法,到Node里面去找

  3、在document里的常用方法

#获取标签,返回集合 NodeList
getElementsByTagName(String tagname) 

# 创建标签
createElement(String tagName)

#创建文本
createTextNode(String data) 

#把文本添加到标签下面
appendChild(Node newChild) 

#删除节点
removeChild(Node oldChild) 

#获取父节点
getParentNode() 

# 得到标签里面的内容             
getTextContent()

NodeList常用方法

NodeList list
#得到集合的长度
getLength() 

#下标取到具体的值
item(int index)

二、DocumentBuilderFactory类

  DocumentBuilderFactory类是解析器工厂类,它也是抽象类,不可以通过new来获取该类的实例,通过方法newInstance()获取DocumentBuilderFactory的实例


三、jaxp的dom操作

对以下一个简单的xml文件进行操作

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<person>
    <p>
        <name>zhangsna</name>
        <age>20</age>    
    </p>
    <p>
        <name>lisi</name>
        <sex>nv</sex>
    </p>
</person>

1、查询操作(查询name属性值)

public static void Chaxum() throws ParserConfigurationException, IOException, SAXException {
        //创建解析工厂
        DocumentBuilderFactory builderFactory= DocumentBuilderFactory.newInstance();
        //创建解析器
        DocumentBuilder builder =builderFactory.newDocumentBuilder();
        //解析xml返回document
        Document document=builder.parse("src/people.xml");
       //得到name元素
        NodeList list=document.getElementsByTagName("name");
        //循环获得每一个name元素里的值
        for(int i=0;i<list.getLength();i++){
            Node name1=list.item(i);
            String s=name1.getTextContent();
            System.out.println(s);
        }
    }

运行结果:

2、添加操作

在第一个p标签内添加一个<sex>nan<sex>

 public static void add() throws IOException, SAXException, ParserConfigurationException, TransformerException {
        //创建解析工厂
        DocumentBuilderFactory builderFactory= DocumentBuilderFactory.newInstance();
        //创建解析器
        DocumentBuilder builder =builderFactory.newDocumentBuilder();
        //解析xml返回document
        Document document=builder.parse("src/people.xml");
        //得到第一个p标签
        Node list= (Node) document.getElementsByTagName("p").item(0);
        //创建sex标签
        Node sex1=document.createElement("sex");
        //创建文本
        Node s=document.createTextNode("nan");
        //把文本添加到sex下面
        sex1.appendChild(s);
        //把sex添加到第一个p1下面
        list.appendChild(sex1);
        //回写xml
        TransformerFactory transformerFactory=TransformerFactory.newInstance();
        Transformer transformer=transformerFactory.newTransformer();
        transformer.transform(new DOMSource(document),new StreamResult("src/people.xml"));
    }

运行后xml文件如下:

此时确实将<sex>nan<sex>添加了进去,但是jaxp对于格式化操作很弱,所以xml代码会乱掉

3、删除操作

将刚添加的<sex>nan<sex>删去

public static void remove() throws ParserConfigurationException, IOException, SAXException, TransformerException {
        //创建解析工厂
        DocumentBuilderFactory builderFactory= DocumentBuilderFactory.newInstance();
        //创建解析器
        DocumentBuilder builder =builderFactory.newDocumentBuilder();
        //解析xml返回document
        Document document=builder.parse("src/people.xml");
        //获取sex元素
        Node sex1= (Node) document.getElementsByTagName("sex").item(0);
        //获取sex的父节点
        Node parentnode=sex1.getParentNode();
        //删除使用父节点删除
        parentnode.removeChild(sex1);
        //回写xml
        TransformerFactory transformerFactory=TransformerFactory.newInstance();
        Transformer transformer=transformerFactory.newTransformer();
        transformer.transform(new DOMSource(document),new StreamResult("src/people.xml"));
    }

运行后xml文件如下:

此时就删去了刚添加的<sex>nan<sex>,同样jaxp对于格式化操作很弱,所以xml代码会乱掉


4、替换操作

将第二个p标签下的<sex>nv<sex>换成<sex>nan<sex>

public static void replace() throws ParserConfigurationException, IOException, SAXException, TransformerException {
        //创建解析工厂
        DocumentBuilderFactory builderFactory= DocumentBuilderFactory.newInstance();
        //创建解析器
        DocumentBuilder builder =builderFactory.newDocumentBuilder();
        //解析xml返回document
        Document document=builder.parse("src/people.xml");
        //获取sex元素
        Node sex1= (Node) 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/people.xml"));
    }

运行后xml文件如下:

5、递归打印出所有元素

 public static void listElement() throws ParserConfigurationException, IOException, SAXException {
        //创建解析工厂
        DocumentBuilderFactory builderFactory= DocumentBuilderFactory.newInstance();
        //创建解析器
        DocumentBuilder builder =builderFactory.newDocumentBuilder();
        //解析xml返回document
        Document document=builder.parse("src/people.xml");
        //调用递归方法
        digui(document);
    }
    public static void digui(Node node){
        System.out.println(node.getNodeName());//打印元素
        NodeList list=node.getChildNodes();   //得到一层子节点
        for(int i=0;i<list.getLength();i++){
            Node node1=list.item(i);
            digui(node1);
        }

运行结果:

此时你会发现有很多#text,这是因为xml把空格和换行都当成内容去解析,所以会出现很多#text
你也可以在输出前加一个判断语句来规范输出:

    if(node.getNodeType()==Node.ENTITY_NODE){  //判断是元素类型则进行打印
        System.out.println(node.getNodeName());
    }

猜你喜欢

转载自blog.csdn.net/brilliantZC/article/details/81904723