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

解析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>
时间: 2024-10-19 23:49:33

java解析xml数据(使用jaxp的方式)的相关文章

XML基础+Java解析XML +几种解析方式的性能比较

XML基础+Java解析XML 一:XML基础 XML是什么: 可扩展的标记语言 XML能干什么: 描述数据.存储数据.传输(交换)数据. XML与HTML区别: 目的不一样 XML 被设计用来描述数据,其焦点是数据的内容. HTML 被设计用来展示数据,其焦点是数据的外观. HTML可以不关闭标签(即标签可以不成对出现),但XML必须关闭标签(即标签必须成对出现). HTML中的标签标识文本如何展示,而XML中的标签标识文本是什么含义(什么类型的文本). XML文档节点类型 u     文档(

java解析xml文件四种方式介绍、性能比较和基本使用方法

一.介绍: 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM以及广义的基于树的处理具有几个优点.首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改.它还可以在任何时候在树中上下导航,而不

Android系列之网络(四)----SAX方式解析XML数据

?[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4044170.html 联系方式:[email protected] [系列]Android系列之网络:(持续更新) Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据) Android系列之网络(二)----HTTP请求头与响应头 Androi

网络相关系列之四:数据解析之SAX方式解析XML数据

一.XML和Json数据的引入: 通常情况下.每一个须要訪问网络的应用程序都会有一个自己的server.我们能够向server提交数据,也能够从server获取数据.只是这个时候就有一个问题,这些数据是以什么格式在网络上传输的呢?一般我们都会在网络上传输一些格式化后的数据,这样的数据会有一定的结构规格和语言,当还有一方收到数据消息后就能够依照同样的结构规格进行解析.从而取出它想要的那部分内容. 在网络上数据传输最经常使用的格式:XML和Json.本文就来学习一下XML数据的解析,Json格式的数

JAVA解析XML之SAX方式

JAVA解析XML之SAX方式 SAX解析xml步骤 通过SAXParseFactory的静态newInstance()方法获取SAXParserFactory实例factory 通过SAXParserFactory实例的newSAXParser()方法返回SAXParser实例parser 创建一个类继承DefaultHandle,重写方法进行业务处理并创建这个类的实例handle 重写DefaultHandle类的方法 startElement方法用来遍历xml文件的开始标签; endEle

IOS开发使用NSXMLParser、GDataXML两种方式解析XML数据

概括:XML数据解析方式有 *IOS原生的NSXMLParser,只支持SAX方式解析,使用简单 *C语言的libxml2,同时支持DOM和SAX方式解析 *google的GDataXML,只支持DOM方式解析,基于libxml2,使用时需要将编译环境配置为非ARC,并添加libxml2.dylib动态库 GDataXMLDocument 1 使用GDataXML的DOM方式解析XML,需要导入#import "GDataXMLNode.h" /** *  DOM方式解析XML数据 *

JAVA解析XML之DOM方式

JAVA解析XML之DOM方式 准备工作 创建DocumentBuilderFactory对象;    创建DocumentBuilder对象; 通过DocumentBuilder对象的parse方法加载xml 解析XML文件的属性名和属性值 解析XML文件的节点名和节点值 常用方法如下: getElementsByTagName(); getLength(); item(); getNodeName(); getNodeValue(); getNodeType(); *getAttribute

Java 解析XML的几种方式:DOM、SAX、JDOM和DOM4J。

归纳总结Java解析XML主要有四中方式,分别是DOM.SAX.JDOM和DOM4J.其中DOM和SAX是官方包自带,另外两个JDOM和DOM4J是第三方包. 一.此篇测试代码用到的XML情况 . 1.XML内容展示 1 <?xml version="1.0" encoding="UTF-8"?> 2 <class> 3 <people> 4 <name>Jack</name> 5 <age>1

详解Java解析XML的四种方法

(1)DOM解析 DOM是html和xml的应用程序接口(API),以层次结构(类似于树型)来组织节点和信息片段,映射XML文档的结构,允许获取 和操作文档的任意部分,是W3C的官方标准 [优点] ①允许应用程序对数据和结构做出更改. ②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据. [缺点] ①通常需要加载整个XML文档来构造层次结构,消耗资源大. [解析详解] ①构建Document对象: DocumentBuilderFactory dbf = DocumentBu