008xml数据格式学习笔记

                   xml数据格式学习笔记

0 xml介绍

第0章 xml介绍

1.什么是xml文件

1.1 xml文件的作用:主要是用来存储和传输数据

​ xml是数据封装和消息传递技术。

1.2 解析xml文件的方法:

​ SAX(边读边解析,适合大文件)

​ DOM、

​ JDom,

​ DOM4J(DOM封装,用起来更方便灵活,适合小文件)、

​ 第1章 SAX解析xml文件

JDK自带

边读边解析,适合大文件,移动端,提供内存比较小的地方,手机APP

​ 第2章 Dom解析xml文件

JDK自带

DOM:文档对象模型

讲xml文档表示为树,在内存中解析和存储xml文档,允许随机访问文档的不同部分

DOM解析XML:

DOM的优点:由于树在内存中是持久的因此可以修改后更新,它还可以在任何时候在树中

上下导航,API使用起来也必将简单。

​ 第3章 JDom解析xml文件

<dependency>
   <groupId>org.jdom</groupId>
    <artifactId>jdom</artifactId>
   <version>2.0.2</version>
</dependency>

JDOM简化了与XML的交互并且比使用DOM实现更快,JDOM与DOM主要有两方面的不同:

​ 1.JDOM仅使用具体类而不使用接口,这在某些方面简化了API,但是同时也限制了灵活性;

​ 2.API大量使用了Collections类,简化了那些已经熟悉了这些类的Java开发者的使用,更容易上手。

​ 第4章 DOM4J解析xml文件

   <dependency>
     <groupId>dom4j</groupId>
     <artifactId>dom4j</artifactId>
     <version>1.6.1</version>
  </dependency> 

​ 操作非常简单,Hibernate用它来读写配置文件

常用对象:

​ saxReader:读取xml文件到Document树结构文件对象

​ Document:是一个xml文档对象树,类比Html文档对象

​ Element:元素节点,通过Document对象可以查找单个元素

DOM4J解析步骤:

1.创建解析器

SAXReader reader = new SAXReader();

2.Document对象:通过解析器read方法获取

Document doc = reader

​ .read(“studentInfo.xml”);

3.获取xml根节点:

Element root = doc.getRootElement();

4.遍历解析子节点

​ 第5章 xpath语法 + dom4j解析

<dependency>
   <groupId>jaxen</groupId>
   <artifactId>jaxen</artifactId>
   <version>1.1.6</version>
</dependency>	 

xpath使用路径表达式来选取XML文档中的节点或者节点集。

节点是通过沿着路径(path)来选取的。

​ 第6章 各种解析方法比较

DOM和JDOM在性能测试时表现不佳,在测试10M文档时内存溢出。

SAX表现较好,这要依赖于它特定的解析方式,一个SAX检测即将到来的XML流,

但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏到内存中)

DOM4J是这场测试的获胜者,目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的

Hibernate也用DOM4J来读取XML配置文件。

Web开发建议使用Dom4j方式解析xml。

​ 第7章 xstream生成解析xml字符串

<dependency>
   <groupId>com.thoughtworks.xstream</groupId>
   <artifactId>xstream</artifactId>
   <version>1.4.9</version>
</dependency>

//1.将Java对象生成xml字符串

XStream xstream = new XStream(

​ new Xpp3Driver());

String xmlStr = xstream.toXML§;

//2.将xml字符串解析成Java对象

Person person = (Person)xstream.fromXML(xmlStr);

1 SAX方式解析xml文件

1.1 person.xml

<?xml version="1.0" encoding="UTF-8"?>
<people>
  <person personid="E01">
     <name>Tony Blair</name>
    <address>10 Downing Street,London,UK</address>
    <tel>(061) 98765</tel>
    <fax>(061) 98765</fax>
    <email>blair@evrywhere.com</email>
  </person>
  <person personid="E02">
     <name>Bill Clinton</name>
    <address>White House,USA</address>
    <tel>(001) 6400 98765</tel>
    <fax>(001) 6400 98765</fax>
    <email>bill@everywhere.com</email>
  </person>
</people>

1.2 SAXReadXML.java

package com.tangguanlin.xml;
import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * 说明:SAX方式解析xml
 * 作者:汤观林
 * 日期:2021年05月22日 15时
 * SAX解析的特点:
 *  1.基于事件驱动
 *  2.顺序读取,速度快
 *  3.不能任意读取节点(灵活性差)
 *  4.解析时占用的内存小
 *  5.SAX更适用于在性能要求更高的设备上使用(Android开发中)
 */
public class SAXReadXML {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {

        //1.创建一个SAX解析器工厂对象
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();

        //2.通过工厂对象创建SAX解析器
       SAXParser saxParser =  saxParserFactory.newSAXParser();

        //3.创建一个数据处理器(需要我们自己来编写)
        PersonHandler personHandler = new PersonHandler();

        //4.开始解析
        FileInputStream fis = new FileInputStream("D:\\05project\\base64\\src\\main\\java\\com\\tangguanlin
                                                  												\\xml\\person.xml");

        saxParser.parse(fis,personHandler);
        List<Person> persons =  personHandler.getPersons();
        for(Person p:persons){
            System.out.println(p);
        }
    }
}

1.3 PersonHandler.java

​ 创建数据处理器实现类

package com.tangguanlin.xml;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.util.ArrayList;
import java.util.List;

/**
 * 说明:创建数据处理器实现类
 * 作者:汤观林
 * 日期:2021年05月22日 15时
 */
public class PersonHandler extends DefaultHandler {
    private List<Person> persons  = null;
    Person p =null; //当前正在解析的person
    private String tag;//用于记录当前正在解析的标签名

    public List<Person> getPersons(){
        return  persons;
    }

    //开始解析文档时调用
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        persons = new ArrayList<>();
        System.out.println("开始解析文档");
    }

    /**
     * 遇到开始标签时调用 <name>
     * @param uri 命名空间 类似于包名 这里没有用
     * @param localName 不带前缀的标签 <person>
     * @param qName 带前缀的标签 <aa:person>  统一用qName即可
     * @param attributes 当前标签的属性集合 personid="E01"
     * @throws SAXException
     */
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        if("person".equals(qName)){ //表示现在解析到<person>标签了
           p = new Person();
           String personid = attributes.getValue("personid");
           p.setPersonid(personid);
        }
        tag = qName;
    }

    //解析文本内容时 调用 zhangsan
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        if(tag!= null){
            if("name".equals(tag)){
                p.setName(new String(ch,start,length));
            }else if("address".equals(tag)){
                p.setAddress(new String(ch,start,length));
            }else if("tel".equals(tag)){
                p.setTel(new String(ch,start,length));
            }else if("fax".equals(tag)){
                p.setFax(new String(ch,start,length));
            }else if("email".equals(tag)){
                p.setEmail(new String(ch,start,length));
            }
        }
    }

    //遇到结束标签时调用  </name>
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        if("person".equals(qName)){
            persons.add(p);
            System.out.println(p);
        }
        tag = null;
    }

    //结束解析文档时调用
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        System.out.println("解析文档结束");
    }
}

运行结果:

开始解析文档
Person{personid='E01', name='Tony Blair', address='10 Downing Street,London,UK', tel='(061) 98765', 
       																	fax='(061) 98765', email='blair@evrywhere.com'}
Person{personid='E02', name='Bill Clinton', address='White House,USA',tel='(001) 6400 98765', 
       																fax='(001) 6400 98765', email='bill@everywhere.com'}

解析文档结束
Person{personid='E01', name='Tony Blair', address='10 Downing Street,London,UK',tel='(061) 98765', 
       																	fax='(061) 98765', email='blair@evrywhere.com'}
Person{personid='E02', name='Bill Clinton', address='White House,USA',tel='(001) 6400 98765', 
       																fax='(001) 6400 98765', email='bill@everywhere.com'}

2 Dom方式解析xml文件

2.1 person.xml

<?xml version="1.0" encoding="UTF-8"?>
<people>
  <person personid="E01">
     <name>Tony Blair</name>
    <address>10 Downing Street,London,UK</address>
    <tel>(061) 98765</tel>
    <fax>(061) 98765</fax>
    <email>blair@evrywhere.com</email>
  </person>
  <person personid="E02">
     <name>Bill Clinton</name>
    <address>White House,USA</address>
    <tel>(001) 6400 98765</tel>
    <fax>(001) 6400 98765</fax>
    <email>bill@everywhere.com</email>
  </person>
</people>

2.2 DomReadXML.java

package com.tangguanlin.xml;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * 说明:DOM方式解析xml
 * 作者:汤观林
 * 日期:2021年05月22日 16时
 * DOM解析XML:
 *  1.基于树型结构,通过解析器一次性把文档加载到内存中,所以会比较占用内存,可以随机访问
 *  2.更加灵活,更适合在WEB开发中使用
 */
public class DomReadXML {
    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {

        //1.创建一个DOM解析器工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        //2.通过工厂对象创建解析器对象
       DocumentBuilder documentBuilder =  factory.newDocumentBuilder();

        //3.解析文档,生成document树
        FileInputStream fis = new FileInputStream("D:\\05project\\base64\\src\\main\\java\\com\\tangguanlin
                                                                                                 \\xml\\person.xml");
        //此代码完成后,整个XML文档已经被加载到内存中,以树状形式存储
        Document doc =  documentBuilder.parse(fis);

        //4.从内存中document树中读取数据
        //获取节点名称为person的所有节点,返回节点集合
        NodeList personNodeList = doc.getElementsByTagName("person");
        Person p = null;

        List<Person> persons = new ArrayList<Person>();
        //此循环会迭代2次
        for(int i=0;i<personNodeList.getLength();i++){
            Node personNode = personNodeList.item(i);
            p = new Person();
            //获取第1个节点的属性值personid的值
           String personid = personNode.getAttributes().getNamedItem("personid").getNodeValue();
           p.setPersonid(personid);
           //获取当前节点的子节点
           NodeList childNotes = personNode.getChildNodes();

           for(int j=0;j<childNotes.getLength();j++){
             Node item =  childNotes.item(j);
             //获取节点名称
             String nodeName = item.getNodeName();
             if("name".equals(nodeName)){
                 p.setName(item.getFirstChild().getNodeValue()); //节点的值 姓名
             }
               if("address".equals(nodeName)){
                   p.setAddress(item.getFirstChild().getNodeValue()); //节点的值 地址
               }
               if("tel".equals(nodeName)){
                   p.setTel(item.getFirstChild().getNodeValue()); //节点的值 电话
               }
               if("fax".equals(nodeName)){
                   p.setFax(item.getFirstChild().getNodeValue()); //节点的值 传真
               }
               if("email".equals(nodeName)){
                   p.setEmail(item.getFirstChild().getNodeValue()); //节点的值 email
               }
           }
            persons.add(p);
        }
        System.out.println("结果是:"+Arrays.toString(persons.toArray()));;
    }
}

运行结果:

结果是:[
     Person{personid='E01', name='Tony Blair', address='10 Downing Street,London,UK', tel='(061) 98765', 
                                                                      fax='(061) 98765', email='blair@evrywhere.com'}, 
     Person{personid='E02', name='Bill Clinton', address='White House,USA',tel='(001) 6400 98765', 
                                                                fax='(001) 6400 98765', email='bill@everywhere.com'}
     ]

3 JDom方式解析xml文件

3.1 JDom依赖

<dependency>
    <groupId>org.jdom</groupId>
    <artifactId>jdom</artifactId>
    <version>2.0.2</version>
</dependency>

3.2 person.xml

<?xml version="1.0" encoding="UTF-8"?>
<people>
  <person personid="E01">
     <name>Tony Blair</name>
    <address>10 Downing Street,London,UK</address>
    <tel>(061) 98765</tel>
    <fax>(061) 98765</fax>
    <email>blair@evrywhere.com</email>
  </person>
  <person personid="E02">
     <name>Bill Clinton</name>
    <address>White House,USA</address>
    <tel>(001) 6400 98765</tel>
    <fax>(001) 6400 98765</fax>
    <email>bill@everywhere.com</email>
  </person>
</people>

Person.java

package com.tangguanlin.xml;
/**
 * 说明:person
 * 作者:汤观林
 * 日期:2021年05月22日 15时
 */
public class Person {
    private String personid;
    private String name;
    private String address;
    private String tel;
    private String fax;
    private String email;

    public Person() {
    }

    public String getPersonid() {
        return personid;
    }

    public void setPersonid(String personid) {
        this.personid = personid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public String getFax() {
        return fax;
    }

    public void setFax(String fax) {
        this.fax = fax;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "Person{" +
                "personid='" + personid + '\'' +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", tel='" + tel + '\'' +
                ", fax='" + fax + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

3.2 JDomReadXML

package com.tangguanlin.xml;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * 说明:JDOM方式解析XML
 * 作者:汤观林
 * 日期:2021年05月22日 17时
 * JDOM解析XML:
 *  1.与DOM类似,基于树型结构
 *  2.与DOM的区别:
 *    (1)第三方的组件
 *    (2)实现使用JAVA的Collection接口
 *    (3)效率比DOM高
 */
public class JDomReadXML {
    public static void main(String[] args) throws IOException, JDOMException {

        List<Person> persons = new ArrayList<Person>();
        Person p = null;

        //1.创建JDom解析器对象
        SAXBuilder saxBuilder =  new SAXBuilder();

        //2.解析文档,生成document树
        FileInputStream fis = new FileInputStream("D:\\05project\\base64\\src\\main\\java\\com\\tangguanlin
                                                                                                \\xml\\person.xml");
        //此代码完成后,整个XML文档已经被加载到内存中,以树状形式存储
        Document doc = saxBuilder.build(fis);

        //3.从内存中document树中读取数据
        //获取到根节点
        Element rootElement = doc.getRootElement();
        //获取根节点下面的所有子节点
        List<Element> personElementList =  rootElement.getChildren();
        for(Element personElement:personElementList){
            p = new Person();
            String personid = personElement.getAttributeValue("personid");
            p.setPersonid(personid);
            //获取到person标签下面的属性list
            List<Element> attrElementList = personElement.getChildren();
            for(Element attrElement:attrElementList){
                String tag = attrElement.getName();
                if("name".equals(tag)){
                    p.setName(attrElement.getValue());
                }else if("address".equals(tag)){
                    p.setAddress(attrElement.getValue());
                }else if("tel".equals(tag)){
                    p.setTel(attrElement.getValue());
                }else if("fax".equals(tag)){
                    p.setFax(attrElement.getValue());
                }else if("email".equals(tag)){
                    p.setEmail(attrElement.getValue());
                }
            }
            persons.add(p);
        }
        System.out.println(Arrays.toString(persons.toArray()));
    }
}

运行结果:

[
 Person{personid='E01', name='Tony Blair', address='10 Downing Street,London,UK',tel='(061) 98765', 
                                                                      fax='(061) 98765', email='blair@evrywhere.com'}, 
 Person{personid='E02', name='Bill Clinton', address='White House,USA',tel='(001) 6400 98765', 
                                                                  fax='(001) 6400 98765', email='bill@everywhere.com'}
]

4 Dom4j方式解析xml文件

4.1 Dom4J依赖

<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>1.6.1</version>
</dependency>

4.2 person.xml

<?xml version="1.0" encoding="UTF-8"?>
<people>
  <person personid="E01">
     <name>Tony Blair</name>
    <address>10 Downing Street,London,UK</address>
    <tel>(061) 98765</tel>
    <fax>(061) 98765</fax>
    <email>blair@evrywhere.com</email>
  </person>
  <person personid="E02">
     <name>Bill Clinton</name>
    <address>White House,USA</address>
    <tel>(001) 6400 98765</tel>
    <fax>(001) 6400 98765</fax>
    <email>bill@everywhere.com</email>
  </person>
</people>

Person.java

package com.tangguanlin.xml;
/**
 * 说明:person
 * 作者:汤观林
 * 日期:2021年05月22日 15时
 */
public class Person {
    private String personid;
    private String name;
    private String address;
    private String tel;
    private String fax;
    private String email;

    public Person() {
    }

    public String getPersonid() {
        return personid;
    }

    public void setPersonid(String personid) {
        this.personid = personid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public String getFax() {
        return fax;
    }

    public void setFax(String fax) {
        this.fax = fax;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "Person{" +
                "personid='" + personid + '\'' +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", tel='" + tel + '\'' +
                ", fax='" + fax + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

4.3 Dom4JReadXML

package com.tangguanlin.xml;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
 * 说明:DOM4J方式解析XML
 * 作者:汤观林
 * 日期:2021年05月22日 18时
 * DOM4J解析XML:
 *  1.基于树型结构,第三方组件
 *  2.解析速度快,效率更高,使用的JAVA中的迭代器实现数据读取,在WEB框架中使用最多(Hibernate)
 */
public class Dom4JReadXML {
    public static void main(String[] args) throws FileNotFoundException, DocumentException {

        List<Person> persons = new ArrayList<>();
        Person p =  null;

        //1.创建Dom4j的解析器对象
        SAXReader saxReader = new SAXReader();

        //2.解析文档,生成document树
        FileInputStream fis = new FileInputStream("D:\\05project\\base64\\src\\main\\java\\com\\tangguanlin
                                                                                              \\xml\\person.xml");
        //此代码完成后,整个XML文档已经被加载到内存中,以树状形式存储
        Document document = saxReader.read(fis);

        //3.从内存中document树中读取数据
        Element rootElement = document.getRootElement();
        Iterator<Element> personIterator = rootElement.elementIterator();
        while(personIterator.hasNext()){
            p = new Person();
            Element personElement = personIterator.next();
            p.setPersonid(personElement.attributeValue("personid"));
            Iterator<Element> attrIterator = personElement.elementIterator();
            while(attrIterator.hasNext()){
                Element attrElement = attrIterator.next();
                String tag = attrElement.getName();
                if("name".equals(tag)){
                    p.setName(attrElement.getText());
                }else if("address".equals(tag)){
                    p.setAddress(attrElement.getText());
                }else if("tel".equals(tag)){
                    p.setTel(attrElement.getText());
                }else if("fax".equals(tag)){
                    p.setFax(attrElement.getText());
                }else if("email".equals(tag)){
                    p.setEmail(attrElement.getText());
                }
            }
           persons.add(p);
        }
        System.out.println(Arrays.toString(persons.toArray()));
    }
}

运行结果:

[
   Person{personid='E01', name='Tony Blair', address='10 Downing Street,London,UK',tel='(061) 98765', 
          															fax='(061) 98765', email='blair@evrywhere.com'}, 
   Person{personid='E02', name='Bill Clinton', address='White House,USA',tel='(001) 6400 98765', 
          														fax='(001) 6400 98765', email='bill@everywhere.com'}
]

5 Dom4j+xpath方式解析xml文件

5.1 Dom4j依赖

<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>1.6.1</version>
</dependency>
<dependency>
    <groupId>jaxen</groupId>
    <artifactId>jaxen</artifactId>
    <version>1.1.6</version>
</dependency>

5.2 sys-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>
  <database-info>
     <driver-name port="7001">com.mysql.jdbc.Driver</driver-name>
     <url>jdbc:mysql://192.168.1.151:8080/bjpowernode</url>
     <user>root</user>
     <password>123</password>
  </database-info>
</config>

5.3 Dom4j_Xpath_ReadXML

package com.tangguanlin.xml;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
 * 说明:Dom4j+xpath解析xml
 * 作者:汤观林
 * 日期:2021年05月22日 22时
 */
public class Dom4j_Xpath_ReadXML {
    public static void main(String[] args) throws FileNotFoundException, DocumentException {

        //1.创建Dom4j的解析器对象
        SAXReader saxReader = new SAXReader();

        //2.解析文档,生成document树
        FileInputStream fis = new FileInputStream("D:\\05project\\base64\\src\\main\\java\\com\\tangguanlin
                                                                                    \\xml\\sys-config.xml");
        //此代码完成后,整个XML文档已经被加载到内存中,以树状形式存储
        Document document = saxReader.read(fis);

        //3.从内存中document树中读取数据

        //driver-name节点元素的xpath路径: /config/database-info/driver-name
        Element driverNameElement =(Element)document.selectSingleNode("/config/database-info/driver-name");

        //获取属性对象
        Attribute portAttr = driverNameElement.attribute("port");
        //获取属性对象的属性内容
        String port = portAttr.getStringValue();
        System.out.println(port);

        //取得driverNameElement节点的属性值port:7001
        String port2 = driverNameElement.attributeValue("port");
        System.out.println(port2);

        //取得driverNameElement节点的文本内容
        String driverName = driverNameElement.getStringValue();
        System.out.println(driverName);

        //url节点元素的xpath路径: /config/database-info/url
        //url节点元素的xpath路径: /config//url
        //url节点元素的xpath路径: //url
        Element urlElement = (Element) document.selectSingleNode("//url");
        String url = urlElement.getText();
        System.out.println(url);
    }
}

运行结果:

7001
7001
com.mysql.jdbc.Driver
jdbc:mysql://192.168.1.151:8080/bjpowernode

6 各种解析方法比较

DOM和JDOM在性能测试时表现不佳,在测试10M文档时内存溢出。

SAX表现较好,这要依赖于它特定的解析方式,一个SAX检测即将到来的XML流,

但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏到内存中)

DOM4J是这场测试的获胜者,目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的

Hibernate也用DOM4J来读取XML配置文件。

Web开发建议使用Dom4j方式解析xml。

7 xstream生成解析xml字符串

7.1 xstream依赖

<dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>1.6.1</version>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
  <artifactId>xstream</artifactId>
    <version>1.4.9</version>
</dependency>

7.2 person.xml

<?xml version="1.0" encoding="UTF-8"?>
<people>
  <person personid="E01">
     <name>Tony Blair</name>
    <address>10 Downing Street,London,UK</address>
    <tel>(061) 98765</tel>
    <fax>(061) 98765</fax>
    <email>blair@evrywhere.com</email>
  </person>
  <person personid="E02">
     <name>Bill Clinton</name>
    <address>White House,USA</address>
    <tel>(001) 6400 98765</tel>
    <fax>(001) 6400 98765</fax>
    <email>bill@everywhere.com</email>
  </person>
</people>

Person.java

package com.tangguanlin.xml;
/**
 * 说明:person
 * 作者:汤观林
 * 日期:2021年05月22日 15时
 */
public class Person {
    private String personid;
    private String name;
    private String address;
    private String tel;
    private String fax;
    private String email;

    public Person() {
    }

    public String getPersonid() {
        return personid;
    }

    public void setPersonid(String personid) {
        this.personid = personid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public String getFax() {
        return fax;
    }

    public void setFax(String fax) {
        this.fax = fax;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "Person{" +
                "personid='" + personid + '\'' +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", tel='" + tel + '\'' +
                ", fax='" + fax + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

7.3 XtreamToXMLStr

package com.tangguanlin.xml;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.Xpp3Driver;
/**
 * 说明:通过Xtream生成解析xml字符串---数据传输时使用
 * 作者:汤观林
 * 日期:2021年05月22日 19时
 */
public class XtreamToXMLStr {
    public static void main(String[] args) {

        //1.将Java对象生成xml字符串
        Person p = new Person();
        p.setPersonid("1212");
        p.setAddress("北京");
        p.setEmail("tangguanlin200@163.com");
        p.setFax("6768789798");
        p.setTel("13838389438");
        p.setName("38");

        XStream xstream = new XStream(new Xpp3Driver());
        //取别名 根标签取别名
        xstream.alias("person", Person.class);
        //设置 对象字段 作为 标签属性
        xstream.useAttributeFor(Person.class, "personid");
        String xmlStr = xstream.toXML(p);
        System.out.println(xmlStr);

        //2.将xml字符串解析成Java对象
        Person person = (Person) xstream.fromXML(xmlStr);
        System.out.println(person);
    }
}

运行结果:

<person personid="1212">
  <name>38</name>
  <address>北京</address>
  <tel>13838389438</tel>
  <fax>6768789798</fax>
  <email>tangguanlin200@163.com</email>
</person>

Person{personid='1212', name='38', address='北京', tel='13838389438',fax='6768789798', email='tangguanlin200@163.com'}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值