JAXP(Java API for XMLProcessing)知识总结

来源:互联网 发布:用js触发a标签的href 编辑:程序博客网 时间:2024/04/29 14:12

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:1.DocumentBuilder解析器类    1.抽象类    2.该类实例可以通过DocumentBuilderFactory.newDocumentBuilder()方法获取。    3.通过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:3.SaxParsers解析器类4.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=0;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=0;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=0;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=0;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,0);    }    private static void getNode(Node node,int n)    {        NodeList nodelist=node.getChildNodes();        for(int i=0;i<nodelist.getLength();i++)        {            for(int j=0;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+1);            }        }    }}

控制台输出

person  p1    name       age     p1    name       age
0 0