`
toreking
  • 浏览: 36110 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

java解析xml常用的三种方法

阅读更多
(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();
...
  
 
<?xml version="1.0" encoding="UTF-8"?> 
<xml> 
    <conn-params> 
        <conn-url>jdbc:mysql://192.168.101.7:3306/bbs</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> 
  
////////////////////////////////////////////////////////////////////////////////////
  
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(); 
        } 
          
    } 
} 
 
  
////////////////////////////////////////////////////////////////////////////////////
  
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; 
    } 
}
 
 
 
 
(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> 
 此为下面即将解析度简单xml结构,并将其封装成一个User对象。
 
////////////////////////////////////////////////////////////////////////////////////
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(); 
        } 
          
    } 
} 
 
////////////////////////////////////////////////////////////////////////////////////
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; 
    } 
      
}
 

[优点]

    (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处理仅要求存取整份文件。举例来说,XSLTXPath需要能够任何时间存取任何解析过的XML树。当SAX以用来建构此树时,DOM解析器在设计上已经是如此了。

分享到:
评论

相关推荐

    java解析xml及4种常用解析比较

    java解析xml及4种常用解析比较

    java解析xml文档的常用方法

    java解析xml文档的常用方法

    JavaXml.zip_java xml_javaXML_java解析xml_文档解析

    常用的java解析xml文档实例(常用的java解析xml文档实例){常用的java解析xml文档实例}

    JAVA解析XML

    JAVA常用的四种解析XML的示例,包括sax、dom、dom4j与jdom

    java解析xml常用的几种方式总结

    主要介绍了java解析xml常用的几种方式总结,有需要的朋友可以参考一下

    java-SAX解析XML、java正则表达式.

    1、java SAX方式的XML解析 和 Myeclipse工程源码 2、java 正则表达式详解和常用例子

    解析xml中的java包

    标准Dom、JDom(为Java提供的解析技术)、Dom4j(优化之后的解析技术)、SAX(大型xml解析的技术) 树模型:DOM、JDOM、Dom4j; 特点:算法丰富、操作比较简单;一次性读取所有内容到内存(不适于大型xml文件解析...

    java常用的4种xml解析方式

    java常用的4种xml解析方式

    XML解析工具

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,...

    解析xmljar包

    java解析xml的常用jar包,dom4j

    经典的DOM解析XML范例

    用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object Module)称为DOM。Sun公司提供了Java API for XML Parsing(JAXP)...

    JAVA -XML解析总结

    XML解析总结归纳 总结了java常用的xml解析常用

    xml解析的多种方法

    为java解析xml方面不太理解的小伙伴一些易懂的讲解,java解析xml共4种常用方法 1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析

    android java xml 解析生成jar

    android java开发常用 xml数据格式解析 生成 jdom.jar 有各种实例代码,加压查找即可看到个版本jar 包

    Java解析XML格式数据的方法详解

    主要介绍了Java解析XML格式数据的方法,并展示了较为常用的Java dom来解析XML的例子,需要的朋友可以参考下

    Gei基于Java的XML解析器实现.pdf

    用java解析XML文档,最常用的有两种方法:使用基于事件SAX和基于树和节点的文档对象模型DOM。该文给出一种基于java的采用DOM的XML解析器的实现方法,详细给出了该方法的设计方案和所用到的关键类和算法。

    实验5 JAVA常用类.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)实验报告,基础篇有JAVA环境搭建、Java语言基础、方法和数组、面向对象基础、Java常用类、继承与接口、成员访问控制与异常、JavaFX程序设计、Java...

    Java编程中更新XML文档的常用方法

    本文简要的讨论了Java语言编程中更新XML文档的四种常用方法,并且分析这四种方法的优劣。其次,本文还对如何控制Java程序输出的XML文档的格式做了展开论述。 JAXP是Java API for XML Processing的英文字头缩写,中文...

    java xml常用操作代码

    将xml的创建,增加元素,查找元素,修改元素,使用dom,sax,dom4j方式解析xml文件,希望对大家有帮助

Global site tag (gtag.js) - Google Analytics