首页 javaWEB java解析xml常用的三种方法

java解析xml常用的三种方法

java解析xml常用的三种方法 – – ITeye技术网站 (I)Java通过DOM解析XML 1>得到DOM解…

java解析xml常用的三种方法 - - ITeye技术网站

(I)Java通过DOM解析XML

1>得到DOM解析器的工厂实例
DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
得到javax.xml.parsers.DocumentBuilderFactory;类的实例就是我们要的解析器工厂
2>从DOM工厂获得DOM解析器
DocumentBuilder dombuilder=domfac.newDocumentBuilder();
通过javax.xml.parsers.DocumentBuilderFactory实例的静态方法newDocumentBuilder()得到DOM解析器3>把要解析的XML文档转化为输入流,以便DOM解析器解析它
InputStream is=new FileInputStream(“bin/library.xml”);
InputStream是一个接口。

4>解析XML文档的输入流,得到一个Document
Document doc=dombuilder.parse(is);
由XML文档的输入流得到一个org.w3c.dom.Document对象,以后的处理都是对Document对象进行的
5>得到XML文档的根节点
Element root=doc.getDocumentElement();
在DOM中只有根节点是一个org.w3c.dom.Element对象。6>得到节点的子节点
NodeList books=root.getChildNodes();
for(int i=0;i<books.getLength();i++){
Node book=books.item(i);
}
这是用一个org.w3c.dom.NodeList接口来存放它所有子节点的,还有一种轮循子节点的方法,后面有介绍

7>取得节点的属性值
String email=book.getAttributes().getNamedItem(“email”).getNodeValue();
System.out.println(email);
注意,节点的属性也是它的子节点。它的节点类型也是Node.ELEMENT_NODE

8>轮循子节点
for(Node node=book.getFirstChild();node!=null;node=node.getNextSibling()){

if(node.getNodeType()==Node.ELEMENT_NODE){

if(node.getNodeName().equals(“name”)){

String name=node.getNodeValue();

String name1=node.getFirstChild().getNodeValue();

if(node.getNodeName().equals(“price”)){

String price=node.getFirstChild().getNodeValue();

 
<SPAN style="FONT-FAMILY: courier new, courier; FONT-SIZE: small"><?xml version="1.0" encoding="UTF-8"?>
<xml>
    <conn-params>
        <conn-url>jdbc:mysql://192.168.101.7:3306s</conn-url>
        <conn-driver>com.mysql.jdbc.Driver</conn-driver>
        <conn-username>root</conn-username>
        <conn-password>root</conn-password>
    </conn-params>

    <person>
        <user>
            <username>xzc</username>
            <password>sdf23223</password>
            <birthday>2012-01-23</birthday>
        </user>
        <user>
            <username>误闯</username>
            <password>wuchuang3223</password>
            <birthday>2002-01-03</birthday>
        </user>
    </person>
</xml> </SPAN>

 

 

<SPAN style="FONT-FAMILY: courier new, courier; FONT-SIZE: small">package com.xcz.xml;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

import com.xcz.po.User;
import com.xcz.xml.util.DomUtil;

public class Dom4Xml {

    private DomUtil domUtil = new DomUtil();

    public static void main(String[] args) {
        try {
            File f = new File("src/jdbc-params.xml");
            List<User> list = new Dom4Xml().domUtil.parseXml(f);
            for (User user : list) {
                System.out.println(user);
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
} </SPAN>

 

<SPAN style="FONT-FAMILY: courier new, courier; FONT-SIZE: small">package com.xcz.xml.util;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

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

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.xcz.po.User;

public class DomUtil {

    private DocumentBuilderFactory factory;
    private DocumentBuilder builder;
    private Document document;

    private List<User> list;

    /**
     * 创建一个DocumentBuilderFactory 对象
     * @return DocumentBuilderFactory
     */
    private DocumentBuilderFactory getDocumentBuilderFactory(){
        return DocumentBuilderFactory.newInstance();
    }

    /**
     * 创建一个DocumentBulider 对象
     * @param DocumentBuilderFactory fac
     * @return DocumentBuilder
     * @throws ParserConfigurationException
     */
    private DocumentBuilder getDocumentBuilder(DocumentBuilderFactory fac) throws ParserConfigurationException{
        return fac.newDocumentBuilder();
    }

    /**
     * 功能:解析XML文件
     * @param file xml文件
     * @return List<User>
     * @throws ParserConfigurationException
     * @throws SAXException
     * @throws IOException
     */
    public List<User> parseXml(File file) throws ParserConfigurationException, SAXException, IOException{
        factory = getDocumentBuilderFactory();
        builder = getDocumentBuilder(factory);
        document = builder.parse(file);
        List<User> list = parseXmlProcess(document);
        return list;
    }

    /**
     * 功能:xml文件具体解析过程
     * @param document
     * @return List<User>
     */
    private List<User> parseXmlProcess(Document document){
        list = new ArrayList<User>();

        //获取根节点
        Element root = document.getDocumentElement();
        //获取根节点下面的所有孩子节点
        NodeList childNodes = root.getChildNodes();

        for(int i=0; i<childNodes.getLength(); i++){//获取节点集合长度:getLength()
            Node node = childNodes.item(i);//获取第index 节点:item(index)

            if("person".equals(node.getNodeName())){//获取当前节点tagName:getNodeName()
                NodeList pChildNodes = node.getChildNodes();

                for(int p=0; p<pChildNodes.getLength(); p++){
                    Node pNode = pChildNodes.item(p);

                    if("user".equals(pNode.getNodeName())){
                        User user = new User();
                        NodeList uChildNodes = pNode.getChildNodes();

                        for(int u=0;u<uChildNodes.getLength();u++){

                            Node uNode = uChildNodes.item(u);

                            if("username".equals(uNode.getNodeName())){
                                user.setUsername(uNode.getTextContent());//获取当前节点的具体内容:getTextContent()
                            }
                            if("password".equals(uNode.getNodeName())){
                                user.setPassword(uNode.getTextContent());
                            }
                            if("birthday".equals(uNode.getNodeName())){
                                user.setBirthday(uNode.getTextContent());
                            }
                        }
                        list.add(user);
                    }
                }
            }
        }

        return list;
    }
}</SPAN>

 

java解析xml常用的三种方法 – – ITeye技术网站

(II)Java通过SAX解析XML
    Simple API for XML(简称SAX)是个循序存取XML的解析器API。     一个实现SAX的解析器(也就是“SAX Parser”)以一个串流解析器的型式作用,拥有事件驱动API。由使用者定义回调函数,解析时,若发生事件的话会被调用。SAX事件包括:

  • XML 文字 节点
  • XML 元素 节点
  • XML 处理指令
  • XML 注释
<person>
    <user>
        <username>谢成志</username>
        <password>6626310xie</password>
        <sex>男</sex>
        <birthday>1988/11/28</birthday>
        <headpic>
            <pictitle>ermao</pictitle>
            <picurl>images/head1.jpg</picurl>
        </headpic>
    </user>
</person>

 

java解析xml常用的三种方法 – – ITeye技术网站

此为下面即将解析度简单xml结构,并将其封装成一个User对象。

 

<SPAN style="FONT-FAMILY: courier new, courier; FONT-SIZE: small">package com.xcz.xml;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

import com.xcz.util.SaxUtil;

public class Sax4XML {

    public static void main(String[] args) {

        try {
            //1.获取factory
            SAXParserFactory factory = SAXParserFactory.newInstance();
            //2.获取parser
            SAXParser parser = factory.newSAXParser();
            //3.获取解析时的监听器对象
            SaxUtil su = new SaxUtil();
            //4.开始解析
            parser.parse(new File("src/user-params.xml"), su);

            System.out.println(su.getUser());

        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
</SPAN>

 

<SPAN style="FONT-FAMILY: courier new, courier; FONT-SIZE: small">package com.xcz.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import com.xcz.po.HeadPic;
import com.xcz.po.User;

/**
 * 定义xml解析时的监听类
 *
 * 实现方式有很多,可以实现接口:ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler
 * 但我们常用的继承:DefaultHandler
 */
public class SaxUtil extends DefaultHandler {

    private User user;
    private HeadPic headPic;
    private String content;
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        content = new String(ch, start, length);
    }

    //当解析到文本开始时触发
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
    }

    //当解析到文本结束时触发
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }

    //当解析到元素开始时触发
    @Override
    public void startElement(String uri, String localName, String name,
            Attributes attributes) throws SAXException
    {
        if("user".equals(name))
        {
            user = new User();
        }
        if("headpic".equals(name))
        {
            headPic = new HeadPic();
        }
    }

    //当解析到元素结束时触发
    @Override
    public void endElement(String uri, String localName, String name)
            throws SAXException
    {
        if("username".equals(name))
        {
            user.setUsername(content);
        }
        if("password".equals(name))
        {
            user.setPassword(content);
        }
        if("sex".equals(name))
        {
            user.setSex(content);
        }
        if("birthday".equals(name))
        {
            try {
                user.setBirthday(sdf.parse(content));
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if("pictitle".equals(name))
        {
            headPic.setPicTitle(content);
        }
        if("picurl".equals(name))
        {
            headPic.setPicUrl(content);
            user.setHeadPic(headPic);
        }

    }

    public User getUser(){
        return user;
    }

}</SPAN>

java解析xml常用的三种方法 – – ITeye技术网站

[优点]

(1).节约内存开销

SAX解析器在某些方面优于DOM风格解析器,因为SAX解析器的内存使用量一般远低于DOM解析器使用量。DOM解析器在任何处理开始之前,必须将xml以整棵树放在内存,所以DOM解析器的内存使用量完全根据输入资料的大小。相对来说,SAX解析器的内存内容,是只基于XML档案的最大深度(XML树的最大深度)和单一XML项目上XML属性储存的最大资料。

(2)解析速度快

因为SAX事件驱动的本质,处理文件通常会比DOM风格的解析器快。

[缺点]

SAX事件驱动的模型对于XML解析很有用,但它确实有某些缺点。

某些种类的XML验证需要存取整份文件。例如,一个DTD IDREF属性需要文件内有项目使用指定字串当成DTD ID属性。要在SAX解析器内验证,必须追踪每个之前遇过的ID和IDREF属性,检查是否有任何相符。更甚者,一个IDREF找不到对应的ID,使用者只会在整份文件都解析完后才发现,若这种连结对于建立有效输出是重要的,那用在处理整份文件的时间只是浪费。

另外,某些XML处理仅要求存取整份文件。举例来说,XSLT及XPath需要能够任何时间存取任何解析过的XML树。当SAX以用来建构此树时,DOM解析器在设计上已经是如此了。

 

 

 

免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。

为您推荐

nodejs 整理记录

nodejs 整理记录

下载包 https://blog.csdn.net/m0_59878114/article/details/120274...
websocket测试html

websocket测试html

<!DOCTYPE html> <html> <head> <meta cha...
bigdemical两个数比较大小

bigdemical两个数比较大小

/*int result = bigdemical1.compareTo(bigdemical2) result = -...
Beetl2.7 中文文档

Beetl2.7 中文文档

Beetl目前版本是2.7.23,相对于其他java模板引擎,具有功能齐全,语法直观,性能超高,以及编写的模板容易维护等...
纯CSS实现多个便签在一行展示,拖动滚动

纯CSS实现多个便签在一行展示,拖动滚动

div <h2>请注意需要在移动端预览,PC端拖拽无效果</h2> <div class=...
返回顶部