Java处理XML的方法

  • DOM(Document Object Model)  API: 顾名思义,基于dom 书读写xml。
    public static void main(String[] args) throws SAXException, IOException,
            ParserConfigurationException {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        //dbf.setNamespaceAware(true);
        //dbf.setValidating(true);
        DocumentBuilder db = dbf.newDocumentBuilder();
        OutputStreamWriter errorWriter = new OutputStreamWriter(System.err,
                "UTF-8");
        db.setErrorHandler(new MyErrorHandler(
                new PrintWriter(errorWriter, true)));
        Document doc = db.parse(new File("resources/dom_example.xml"));
        doc.getDocumentElement().normalize();
        Element node = doc.getDocumentElement();
        traverse(node, 0);
    }

    private static void traverse(Node node, int deep) {
        if (null == node) {
            return;
        }
        Node sibling = node;
        while (null != sibling && Node.ELEMENT_NODE == sibling.getNodeType()) {
            printNode(node, deep);
            traverse(sibling.getFirstChild(), deep + 1);
            sibling = node.getNextSibling();
        }
    }

除了JDK自己的dom实现外,常用的dom库有DOM4J。    

  • SAX(Simple API for XML) API: 按顺序读取xml。该api只能读取xml文件。它提供一种基于Push-Parsing Model的事件驱动方式解析xml。

    既然是Push parsing,我们需要实现Handler来(ContentHandler, ErrorHandler, DTDHandler, etc.)对获取的事件进行处理。通常我们继承DefaultHandler。

    

    SAXParserFactory spf = SAXParserFactory.newInstance();
        spf.setNamespaceAware(true);
        SAXParser saxParser = spf.newSAXParser();
        XMLReader xmlReader = saxParser.getXMLReader();
        xmlReader.setContentHandler(new SAXLocalNameCount());
        xmlReader.setErrorHandler(new MyErrorHandler(System.err));
        xmlReader.parse("sax_example.xml");

    DOM和SAX都是1.6之前的api,因此,最好不要再使用。

    从1.6开始,为了提高效率,提供了几种新的api用于处理xml:

  • Stax(Streaming API for XML):一种基于Pull-Parsing model的xml处理api。有关XML Pull的内容可以参考http://www.xmlpull.org/v1/download/unpacked/doc/quick_intro.html。

    

    Stax API分为Cursor API和Event Iterator API。

      Cursor API提供一个前向Cursor遍历xml。主要包括2个接口:

        XMLStreamReader

        XMLStreamWriter:

      Event Iterator API将xml流看成事件对象。解析器(Parser)通过pull方式获取事件。主要包括以下接口:

        XMLEvent

        XMLEventReader

        XMLEventWriter

      Event Iterator API与Cursor API相比较而言有以下优点:

      1. 从XMLEvent创造的对象是不可更改的。能用于array,list,map。  
      2. 可以继承XMLEvent。
      3. 更容易添加和删除事件。

      如果内存受限或是要求高performance,优先选择Cursor API;其他情况下尽量使用Event Iterator API。

      XMLInputFactory用于创建xml流读取。XMLInputFactory.newInstance按照以下步骤决定XMLInputFactory实例:

      1. 使用javax.xml.stream.XMLInputFactory系统属性;
      2. 使用JRE下lib/xml.stream.properties文件;
      3. 使用Services API,在META-INF/services/javax.xml.stream.XMLInputFactory里查找;
      4. 使用系统默认的XMLInputFactory实现;   

      XMLOutputFactory用于创建xml流写入。

      XMLEventFactory用于创建事件。

      XMLStreamReader:

              

 XMLInputFactory f = XMLInputFactory.newInstance();
 XMLStreamReader r = f.createXMLStreamReader( ... );
 while(r.hasNext()) {
     r.next();
 }

      XMLEventReader:

      XMLStreamWriter:

      XMLEventWriter:

 

      报告CDATA Event:javax.xml.stream.XMLStreamReader 默认不报告CDATA事件。如果需要的话,可以按以下配置XMLInputFactory:

XMLInputFactory factory = XMLInptuFactory.newInstance();
factory.setProperty("report-cdata-event", Boolean.TRUE);

      具体例子可以参考:http://docs.oracle.com/javase/tutorial/jaxp/stax/example.html

      

    关于Stax和其他Xml api的对比可以参照http://docs.oracle.com/javase/tutorial/jaxp/stax/why.html

  • JAXB(Java Architecture for XML Binding)
时间: 2024-11-07 04:17:24

Java处理XML的方法的相关文章

java读取XML的方法

1.DOM 实现方法 xml文件 <?xml version="1.0" encoding="utf-8"?> <Accounts> <Account type="type1"> <code>100001</code> <pass>123</pass> <name>张三</name> <money>1000000.00</

最简单的JAVA解析XML字符串方法

引入 dom4j 包<dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version></dependency> 比如阿里云视频转码服务的回调通知解析,代码如下: import org.dom4j.Document; import org.dom4j.DocumentException; im

java解析xml的三种方法

java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; // public class Saxhandler extends DefaultHandler { @Override public void startDocument() throws

详解Java解析XML的四种方法

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

java操作xml超简单的方法

用dom4j?SAX?no,no,no,光看api和帮助文档就烦,有没有更简单的方法呢?答案是有的. 那就是默默无名的:JAXB jaxb是啥? 摘抄一段度娘百科的介绍: JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,这样一来可以更好的标志可以转换为JSON对象的JAVA类.JAXB允许JAVA人员将JAVA类映射为XML表示方式,常用的注解包括:@XmlRootElement,@X

JAVA常用的XML解析方法

转并总结自(java xml) JAVA常用的解析xml的方法有四种,分别是DOM,JAX,JDOM,DOM4j xml文件 <?xml version="1.0" encoding="GB2312"?> <RESULT> <VALUE> <NO>1000001</NO> <ADDR>达达木图收费站</ADDR> </VALUE> <VALUE> <NO

Java获取路径方法&amp;相对路径读取xml文件方法

Java获取路径方法&相对路径读取xml文件方法 (1).request.getRealPath("/");//不推荐使用获取工程的根路径 (2).request.getRealPath(request.getRequestURI());//获取jsp的路径,这个方法比较好用,可以直接在servlet和jsp中使用 (3).request.getSession().getServletContext().getRealPath("/");//获取工程的根路径

Java解析XML文件的四种方法

[摘要] 可扩展标志语言(XML)在实现信息标准化.信息的交流与共享上有其独特的技术优势,因此受到了广泛的重视.本文先简单的介绍了XML基本知识,然后从XML应用入手总结了四种现今最常见的XML的解析方法,介绍了这四种方法的特点,其中包括优点与不足之处.最后给出了一个简单的案例来对这四种解析进行代码介绍. [关键字] XML文件,DOM,SAX,JDOM,DOM4J [引言] XML即可扩展标记语言(EXtensible Markup Language),是标准通用标记语言的子集,是一种用于标记

详解Java解析XML的四种方法(转)

XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML.本文将详细介绍用Java解析XML的四种方法. XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xm