zoukankan      html  css  js  c++  java
  • XML文件解析之JDOM解析

    1.JDOM介绍

    JDOM的官方网站是http://www.jdom.org/,JDOM解析用到的jar包可以在http://www.jdom.org/dist/binary/中下载,最新的JDOM2的版本是2.0.5,JDOM1的版本是1.1.3,根据官网中的介绍可以知道。JDOM是一个在基于内存的XML模型,它用于读写创建修改XML文档。JDOM和DOM相似因为他们都提供了内存XML文档模型,但是DOM被设计用于很多种语言(C,C++,ECMSctipr,Java,JScript,Lingo,PHP,PLSQL和Python),但是JDOM只是被设计用来处理Java。因为这个原因JDOM不遵循w3c标准规范。JDOM不是一个XML解析器但是它可以使用SAX,STAX或者DOM解析器用来构建一个JDOM文档。

    2 JDOM2相关介绍:

    2.1.1主要的包包括

    org.jdom2
    
    This package contains the core classes that represent the XML components.
    
    Document - Represents the complete XML document. It provides access to the root element and also the docType.
    DocType - Represents an XML DOCTYPE.
    Element - Represents an XML element. Has methods to manipulate the child elements, its textual content, attributes and namespaces.
    Attribute - This represents an XML attribute. There are methods to get and set the value of the attribute and also the namespace. The Attribute has a parent and an AttributeType.
    Namespace - Represents an XML Namespace.
    CDATA - This represents an XML CDATA section.
    Text - This represents an XML Text.
    Comment - Represents an XML comment. Users can get and set comment text.
    EntityRef - Represents an XML EnityRef.
    ProcessingInstruction - Represents an XML Processing Instruction
    Content - This is an abstract class which is extended by those classes that can be a child of a org.jdom2.Parent class (Element, CDATA, Comment, DocType, EntityRef, ProcessingInstruction, Text)
    org.jdom2.filter
    
    These package has filters that allow filtering based on type, name, value or other parameters. It also allows ANDing, ORing and Negating filters. Filters are used in the public <E extends Content> List<E> getContent(final Filter<E> filter) and public <F extends Content> IteratorIterable<F> getDescendants(final Filter<F> filter) methods of the Element class. Filters are also using in the XPath package of JDom2.
    
    org.jdom2.input
    
    This package has the core classes responsible for building the JDOM2 document from DOM, SAX or StAX. The important classes are
    
    SAXBuilder - Builds a JDOM document from SAX parser.
    DOMBuilder - Builds a JDOM document from pre-existing org.w3c.dom.DOM document.
    StaxEventBuilder - Builds a JDOM document from StAX XMLEventReader
    StaxStreamBuilder - Builds a JDOM document from StAX XMLStreamReader
    org.jdom2.output
    
    These package has classes to ouput the JDOM2 document to various destinations. The main classes are :
    
    XMLOutputter - Output a JDOM2 document as a stream of bytes.
    DOMOutputter - Convert a JDOM2 document into a DOM document. It can also convert various JDOM2 components to its equivalent DOM components
    SAXOutputter - Convert a JDOM2 document into a stream of SAX events
    StAXEventOutputter - output a JDOM2 document to an XMLEventWriter.
    StAXStreamOutputter - Output a JDOM2 document to an XMLStreamWriter.
    Other Packages
    
    org.jdom2.transform - Helps with XML transformation using JAXP TrAX classes.
    org.jdom2.xpath - Support for XPath in JDOM2. By default, it uses the Jaxen xpath library

    2.1.2具体的实现

    http://www.cnblogs.com/hoojo/archive/2011/08/11/2134638.html 这篇文章介绍的很详细,这里不再赘述。感谢@hoojo

    3、JDOM1的介绍

    废话少说直接写实现:

    3.1处理的XML文档内容

    <?xml version="1.0" encoding="UTF-8"?>
    <world>
        <comuntry id="1">
            <name>China</name>
            <capital>Beijing</capital>
            <population>1234</population>
            <area>960</area>
        </comuntry>
        <comuntry id="2">
            <name id="">America</name>
            <capital>Washington</capital>
            <population>234</population>
            <area>900</area>
        </comuntry>
        <comuntry id="3">
            <name >Japan</name>
            <capital>Tokyo</capital>
            <population>234</population>
            <area>60</area>
        </comuntry>
        <comuntry id="4">
            <name >Russia</name>
            <capital>Moscow</capital>
            <population>34</population>
            <area>1960</area>
        </comuntry>
    </world>

    3.2具体的实现代码包括读写过程

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.List;
    
    import org.jdom.Attribute;
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.JDOMException;
    import org.jdom.input.SAXBuilder;
    import org.jdom.output.Format;
    import org.jdom.output.XMLOutputter;
    
    public class JDOMParse {
    
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            parseXML(new File("world.xml"));
            createXML();
    
        }
    
        public static void parseXML(File xmlPath){
    
            SAXBuilder sb = new SAXBuilder();
            try {
                Document doc = sb.build(new FileInputStream(xmlPath));
                Element root = doc.getRootElement();//获得XML的根元素
                System.out.println("根节点:"+root.getName());
                System.out.println("-----------------------------");
                List list = root.getChildren();
                for(int i = 0; i < list.size(); i++){
                    Element element = (Element)list.get(i);
                    System.out.println("子节点名称:"+element.getName());
                    List att_list = element.getAttributes();
                    for(int j = 0; j < att_list.size(); j++){
                        Attribute att = (Attribute)att_list.get(j);
                        System.out.println(att.getName()+":"+att.getValue());
                    }
                    List tempist = element.getChildren();
                    for(int t = 0; t < tempist.size(); t++){
                        Element temp  = (Element)tempist.get(t);
                        System.out.println(temp.getName()+":"+temp.getValue());
                    }
            
                }
                System.out.println("------------------结束--------------------------");
            } catch (JDOMException e) {
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
        
        public static void createXML(){
            Element root = new Element("root");//创建根元素
            Document doc=new Document(root); 
            Element world = new Element("world");//根元素的子元素
            root.addContent(world);//添加到根
            for(int i=0;i<4;i++){
                Element comuntry = new Element("comuntry");//根元素的子元素
                Attribute att = new Attribute("id",i+"");
                comuntry.setAttribute(att);
                world.addContent(comuntry);
                Element name = new Element("name");//根元素的子元素
                name.setText("中国");
                Element capital = new Element("capital");//根元素的子元素
                capital.setText("Beijing");
                Element population = new Element("population");//根元素的子元素
                name.setText("34");
                Element area = new Element("area");//根元素的子元素
                area.setText("1960");
                
                comuntry.addContent(name).addContent(capital).addContent(population).addContent(area);
            }
            XMLOutputter out = new XMLOutputter();  
            out.setFormat(Format.getCompactFormat().setEncoding("GB2312"));
            System.out.println(out.outputString(doc));
        }
    }

    3.3.结果

    根节点:world
    -----------------------------
    子节点名称:comuntry
    id:1
    name:China
    capital:Beijing
    population:1234
    area:960
    子节点名称:comuntry
    id:2
    name:America
    capital:Washington
    population:234
    area:900
    子节点名称:comuntry
    id:3
    name:Japan
    capital:Tokyo
    population:234
    area:60
    子节点名称:comuntry
    id:4
    name:Russia
    capital:Moscow
    population:34
    area:1960
    ------------------结束--------------------------
    <?xml version="1.0" encoding="GB2312"?>
    <root><world><comuntry id="0"><name>34</name><capital>Beijing</capital><population /><area>1960</area></comuntry><comuntry id="1"><name>34</name><capital>Beijing</capital><population /><area>1960</area></comuntry><comuntry id="2"><name>34</name><capital>Beijing</capital><population /><area>1960</area></comuntry><comuntry id="3"><name>34</name><capital>Beijing</capital><population /><area>1960</area></comuntry></world></root>

    3.4上面的例子是一个很粗糙的举例,需要完善和改进的地方还有很多,比如更加通用化使用递归等等。

    4.上面都只是一个简单的总结和记录,很多的不完善的地方,希望大家多多批评指正。

    至此XML文件解析的四种方式都已经结束完毕了。

  • 相关阅读:
    Java多线程简介
    Java同步简介
    java enum的用法详解
    Instrumentation(3)
    持久化类的三种实例状态
    依赖注入和控制反转
    事务的4个要素及其工作原理
    mysql创建表与索引
    SpringAOP所支持的AspectJ切点指示器
    使用Spring的命名空间p装配属性-摘自《Spring实战(第3版)》
  • 原文地址:https://www.cnblogs.com/zhangminghui/p/4070001.html
Copyright © 2011-2022 走看看