天天看点

JAXP(Java API for XMLProcessing)知识总结XML的解析JAXP解析开发包

XML的解析

1.xml解析方式

DOM方式:Document Object Model,文档对象模型,W3C推荐的使用方式。

SAX方式:Simple API for XML,不是官方标准,但是属于开源社区XML-DEV,几乎所有的XML解析器都支持。

2.xml解析开发包

JAXP:SUN公司推出的解析标准实现。

Dom4J:Dom4J开源社区提供的解析开发包(sun公司的一些技术实现都在使用,使用广泛)。

JDom:开源组织提供的开发包。

JAXP解析开发包

1.jaxp的api

jaxp是javase的一部分

jaxp解析器主要在javax.xml.parsers包内定义

下分为4个类

dom:
.DocumentBuilder解析器类
    .抽象类
    .该类实例可以通过DocumentBuilderFactory.newDocumentBuilder()方法获取。
    .通过parsers("xml文件路径");解析xml文件,返回Document整个文档。
    4.Document为接口,父接口为Node。
    5.Document中的方法getElementsByTagname(String Tagname)可以得到xml中的标签名,返回NodeList集合
    6.createElement(String tagname);创造标签
    7.createTextNode(Strig text);创造文本节点
    8.和js中一样,可以使用appendChild(Node s); removeChild(Node s); replaceChild(Node new,Node old);方法,具体可以查看api
    9.NodeList的方法:getLength();得到集合长度。item(int x);返回在x处的元素,返回值为Node。

2.DocumentBuilderFactory解析器工厂
    抽象类
    可以通过newInstance获取实例
sax:
.SaxParsers解析器类
.SaxParsersFactory解析器工厂
           

2.jaxp实例

1.解析一个xml文件

xml文件盒java文件在同一个包内,my.package

xml文件(路径src/my/2.xml),现在需要查询xml文件中name标签的值

<?xml version="1.0" encoding="UTF-8"?>
<person>
    <p1>
        <name>SS1</name>
        <age>20</age>
    </p1>
    <p1>
        <name>SS2</name>
        <age>21</age>
    </p1>
</person>
           

java文件(路径src/my/JAXP.java)

package my;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class JAXP {
    public static void main(String args[]) throws Exception
    {
        DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
        DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();

        Document document=documentbuilder.parse("src/my/2.xml");

        NodeList nodelist=document.getElementsByTagName("name");

        for(int i=;i<nodelist.getLength();i++)
        {
            System.out.println("name="+nodelist.item(i).getTextContent());//getTextContent()得到标签里内容
        }
    }
}
           

运行后得到name标签的值

通过上例可以看出,想要解析一个xml文件,并查询标签信息,需要几个步骤

1.通过DocumentBuilderFactory.newInstance();方法创建DocumentBuilderFactory 对象。

2.通过DocumentBuilderFactory 对象.newDocumentBuilder();方法创建DocumentBuilder 对象。

3.通过DocumentBuilder 对象.parse(“xml文件路径”);方法创建Document 对象。

4.通过Document 对象.getElementsByTagName(“标签名”);方法创建NodeList 对象。

5.通过NodeList 对象.getLength();方法遍历Node元素,并通过NodeList 对象.item(i)方法获得所需的Node对象,再通过相应方法查询标签信息(比如Node对象.getTextContent()获取标签内容)。

2.给xml文件添加一个标签

假设实现效果为在1中的xml文件中每个人的信息都添加一个

<sex>...</sex>

标签

xml原文件(路径src/my/2.xml)

<?xml version="1.0" encoding="UTF-8"?>
<person>
    <p1>
        <name>SS1</name>
        <age>20</age>
    </p1>
    <p1>
        <name>SS2</name>
        <age>21</age>
    </p1>
</person>
           

java文件(路径src/my/JAXP.java)

package my;

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.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class JAXP {
    public static void main(String args[]) throws Exception
    {
        add();
    }

    private static void add() throws Exception{
        DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
        DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();        

        Document document=documentbuilder.parse("src/my/2.xml");

        NodeList nodelist=document.getElementsByTagName("p1");

        String [] sex={"男","女"};
        for(int i=;i<nodelist.getLength();i++)
        {
            Element s1=document.createElement("sex");
            Text s2=document.createTextNode(sex[i]);

            s1.appendChild(s2);
            nodelist.item(i).appendChild(s1);       
        }

        //因为解析xml的机制是先在内存中开辟一块内存,用来存放xml的解析树,所以现在修改的还只是内存中的xml解析树,实际上对实际的xml原文件没有进行修改,
        //所以需要将内存中修改过的xml回写进文件,才能实现原文件的修改
        TransformerFactory transformerfatory=TransformerFactory.newInstance();
        Transformer transformer=transformerfatory.newTransformer();

        transformer.transform(new DOMSource(document), new StreamResult("src/my/2.xml"));
    }
}
           

修改后的xml文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
    <p1>
        <name>SS1</name>
        <age>20</age>
    <sex>男</sex></p1>
    <p1>
        <name>SS2</name>
        <age>21</age>
    <sex>女</sex></p1>
</person>
           

3.修改xml文件

将2中添加标签后的xml文件的sex标签内容修改掉

xml修改前(scr/my/2.xml),将sex标签中的男女值对调

<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
    <p1>
        <name>SS1</name>
        <age>20</age>
    <sex>男</sex></p1>
    <p1>
        <name>SS2</name>
        <age>21</age>
    <sex>女</sex></p1>
</person>
           

java文件

package my;

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.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class JAXP {
    public static void main(String args[]) throws Exception
    {

        changeSex();
    }

    private static void changeSex() throws Exception{

        DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
        DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();

        Document document=documentbuilder.parse("src/my/2.xml");

        NodeList nodelist=document.getElementsByTagName("sex");

        String [] sex={"女","男"};

        for(int i=;i<nodelist.getLength();i++)
        {
            nodelist.item(i).setTextContent(sex[i]);
        }

        //回写xml
        TransformerFactory transformerfatory=TransformerFactory.newInstance();
        Transformer transformer=transformerfatory.newTransformer();

        transformer.transform(new DOMSource(document), new StreamResult("src/my/2.xml"));
    }
}
           

修改后的xml文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
    <p1>
        <name>SS1</name>
        <age>20</age>
    <sex>女</sex></p1>
    <p1>
        <name>SS2</name>
        <age>21</age>
    <sex>男</sex></p1>
</person>
           

4.删除xml中的标签

将3中的xml文件中的sex标签删去

删除前的xml文件(scr/my/2.xml)

<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
    <p1>
        <name>SS1</name>
        <age>20</age>
    <sex>女</sex></p1>
    <p1>
        <name>SS2</name>
        <age>21</age>
    <sex>男</sex></p1>
</person>
           

java文件

package my;

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;

public class JAXP {
    public static void main(String args[]) throws Exception
    {
        deleteSex();
    }

    private static void deleteSex() throws Exception{

        DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
        DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();

        Document document=documentbuilder.parse("src/my/2.xml");

        NodeList nodelist=document.getElementsByTagName("p1");


        for(int i=;i<nodelist.getLength();i++)
        {
//          Node parent=nodelist.item(i).getParentNode();
            nodelist.item(i).removeChild(nodelist.item(i).getLastChild());
        }

        //回写xml
        TransformerFactory transformerfatory=TransformerFactory.newInstance();
        Transformer transformer=transformerfatory.newTransformer();

        transformer.transform(new DOMSource(document), new StreamResult("src/my/2.xml"));
    }

}
           

删除sex标签的xml文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
    <p1>
        <name>SS1</name>
        <age>20</age></p1>
    <p1>
        <name>SS2</name>
        <age>21</age>
    </p1>
</person>
           

对xml的元素进行遍历

xml文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
    <p1>
        <name>SS1</name>
        <age>20</age></p1>
    <p1>
        <name>SS2</name>
        <age>21</age>
    </p1>
</person>
           

java文件

package my;

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;

public class JAXP {
    public static void main(String args[]) throws Exception
    {
        listElement();
    }

    private static void listElement() throws Exception{

        DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
        DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();

        Document document=documentbuilder.parse("src/my/2.xml");


//      Node node=document;
//      NodeList nodelist=node.getChildNodes();//得到一层子节点(在这里就是xml的根节点了)

        getNode(document,);
    }
    private static void getNode(Node node,int n)
    {
        NodeList nodelist=node.getChildNodes();
        for(int i=;i<nodelist.getLength();i++)
        {
            for(int j=;j<n;j++)
            {
                System.out.print(" ");
            }
            if(nodelist.item(i).getNodeType()==Node.ELEMENT_NODE)
            {
                System.out.println(nodelist.item(i).getNodeName());
                getNode(nodelist.item(i),n+);
            }

        }
    }
}
           

控制台输出

person
  p1
    name
       age
     p1
    name
       age