码迷,mamicode.com
首页 > 编程语言 > 详细

java解析xml数据(使用jaxp的方式)

时间:2015-08-28 12:39:51      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:

解析xml主要有两种方式,一种是dom方式,一种是sax的方式。

1.dom方式是将xml数据作为一个对象生成一个树状结构放入内存中,

  (1)优点:方便对xml中的数据进行增删改,是W3C推荐的处理xml数据的方式

  (2)缺点:这种方式不利于读取比较大的xml文件,容易造成内存溢出。

2.sax方式是采用事件驱动,边读边解析,从上往下,一行一行的解析的方式进行操作

  (1)优点:在处理比较大的xml文件时不会造成内存溢出的情况

  (2)缺点:不能实现增删改的操作,不是官网标准,但是几乎所有的xml解析器都支持它

3.本文暂时先选取三种主要的解析器中的一种解析器jaxp的方式来解析xml数据,主要的三个解析器为:

  (1)sun公司提供的jaxp

  (2)dom4j组织提供的dom4j(用的最多)

  (3)jdom组织提供的jdom

以下是对xml数据的增删改查操作的代码:代码中有注释

package ng.www.jaxp;

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.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.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;

/**
 * 实现jaxp操作xml
 * @author WangWeiWei
 *
 */
public class TestJaxp {

    /**
     * @param args
     * @throws ParserConfigurationException 
     * @throws IOException 
     * @throws SAXException 
     * @throws TransformerException 
     */
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerException {
        //addNode();
        //editNode();
        //deleteNode();
        //selectSin();
        transervalNode();
        //selectAll();
    }
    
    private static void transervalNode() throws ParserConfigurationException, SAXException, IOException {
        /*
         * 此处是遍历xml的节点
         */
        DocumentBuilderFactory builderFactory =DocumentBuilderFactory.newInstance();
        DocumentBuilder builder=builderFactory.newDocumentBuilder();
        Document document=builder.parse("src/person.xml");
        //编写一个方法实现遍历操作
        list1(document);
    }
    
    private static void list1(Node node) {
        if(node.getNodeType()==Node.ELEMENT_NODE){
            System.out.println(node.getNodeName());
        }
        //得到一层子节点
        NodeList nodelist= node.getChildNodes();
         for(int i=0;i<nodelist.getLength();i++){
             //得到每一个节点
             Node node1=nodelist.item(i);
             list1(node1);
         }
    }

    private static void deleteNode() throws ParserConfigurationException, SAXException, IOException, TransformerException {
        /*
         * 此处是删除xml的节点
         */
        DocumentBuilderFactory builderFactory =DocumentBuilderFactory.newInstance();
        DocumentBuilder builder=builderFactory.newDocumentBuilder();
        Document document=builder.parse("src/person.xml");
        //获取sex元素
        Node node=document.getElementsByTagName("sex").item(0);
        Node parentNode=node.getParentNode();
        parentNode.removeChild(node);
        //回写到本地xml文件中
        TransformerFactory factory=TransformerFactory.newInstance();
        Transformer former=factory.newTransformer();
        former.transform(new DOMSource(document), new StreamResult("src/person.xml"));
    }
    
    private static void editNode() throws ParserConfigurationException, SAXException, IOException, TransformerException {
        /*
         * 编辑xml数据(修改sex下的文本数据为nan)
         * 使用sexTextContent方法
         */
        DocumentBuilderFactory builderFactory =DocumentBuilderFactory.newInstance();
        DocumentBuilder builder=builderFactory.newDocumentBuilder();
        Document document=builder.parse("src/person.xml");
        //获取sex的节点
        Node sexNode = document.getElementsByTagName("sex").item(0);
        sexNode.setTextContent("nan");
        //内存中已经修改完毕,现在需要将内存中的数据回写到本地xml文件中才会生效
        TransformerFactory factory=TransformerFactory.newInstance();
        Transformer former=factory.newTransformer();
        former.transform(new DOMSource(document), new StreamResult("src/person.xml"));
    }
    
    private static void addNode() throws ParserConfigurationException, SAXException, IOException, TransformerException{
        /*
         * 这里操作需要会写xml,要不然只是在内存中修改了xml数据,本地文件不会有改变
         */
        DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
        DocumentBuilder builder=builderFactory.newDocumentBuilder();
        Document document=builder.parse("src/person.xml");
        Node node=document.getElementsByTagName("p1").item(0);
        Element element=document.createElement("sex");
        Text text= document.createTextNode("nv");
        element.appendChild(text);
        node.appendChild(element);
        //会写xml数据到本地中
        TransformerFactory formerFactory=TransformerFactory.newInstance();
        Transformer former= formerFactory.newTransformer();
        former.transform(new DOMSource(document), new StreamResult("src/person.xml"));
    }
    
    private static void selectSin() throws ParserConfigurationException, SAXException, IOException{
        /*
         * 1.创建解析器工厂
         * 2.根据解析器工厂创建解析器
         * 3.解析xml,返回document
         * 4.得到所有的name元素
         * 5.利用返回的集合里面的item(0)来获得第一个name元素
         * 6.使用getTextContext方法来获得具体的值
         */
        
        //创建解析器工厂
        DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
        //根据解析器工厂创建一个解析器
        DocumentBuilder builder=builderFactory.newDocumentBuilder();
        //根据解析器来返回xml的document对象
        Document document=builder.parse("src/person.xml");
        //根据document对象来获取所有的name元素,然后利用item(0)获取第一个元素
        Node node=document.getElementsByTagName("name").item(1);
        String s=node.getTextContent();
        System.out.println(s);
    }
    
    private static void selectAll() throws ParserConfigurationException,
            SAXException, IOException {
        // 查询xml中所有标签为name的值
        /*
         * 1.创建解析器工厂
         * 2.根据解析器工厂创建解析器
         * 3.解析xml返回document
         * 4.得到所有的name元素
         * 5.遍历集合,得到每一个name元素
         */
        //创建解析器工厂
        DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
        //创建解析器
        DocumentBuilder builder=builderFactory.newDocumentBuilder();
        //解析xml返回document
        Document document= builder.parse("src/person.xml");
        NodeList list = document.getElementsByTagName("sex");
        //遍历开始
        for(int i=0;i<list.getLength();i++){
            Node name1= list.item(i);
            //得到那么里面元素的值
            String nametext= name1.getTextContent();
            System.out.println(nametext);
        }
    }

}

一下是对应的操作的xml文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
    <p1>
        <name>wangweiwei</name>
        <age>23</age>
        <sex>nv</sex>
    </p1>
    <p1>
        <name>haha</name>
        <age>30</age>
    </p1>
</person>

 

java解析xml数据(使用jaxp的方式)

标签:

原文地址:http://www.cnblogs.com/yudingchen/p/4765841.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!