zoukankan      html  css  js  c++  java
  • [Java]XML数据的请求和DOM技术解析

    刚刚看到一条微博

    今天距离2009级离校倒计时还有100天

    借用“三国杀”里面张辽归天说的一句话——“真的没想到”。这浑浑噩噩的四年没想到就快没了。没想到啊。

    临近毕业季,虽说没课,但是繁琐的事情很多。工作,毕业设计,论文,实习报告……单单找工作就让焦头烂额。也就因为这诸多的原因,博客很久没有更新。这也算是给某公司面试官的回答吧。

    言归正传,技术人终究讲技术。由于毕业设计的缘故,需要写Java解析XML文件。(说起毕业设计就想起坑爹的队友,三个人的小组就我一个人在奋斗。坑啊……)下面分享如何用Java解析XML。

     


    名词解释

    XML在维基百科是这样解释的(大家都知道是什么,我就没有深究的必要了吧)

    可扩展标记语言英语eXtensible Markup Language,简称:XML),是一种标记语言

    Java解析XML的方式有很多。有用PULL的,有用SAX的,这里分享最原始的,用DOM解析。其它改日再论。

    DOM是什么?

    DOM,全称Document Object Model,即“文档对象模型”。

    DOM是一种用于XML文档对象模型,可用于直接访问XML文档的各个部位。在DOM中,文档被模拟为树状,其中XML语法的每一个组成部分都表示一个节点,DOM允许用户遍历文档树,从父节点移动到子节点和兄弟节点。


    XML原始文件

    先给一个XML文件,当然你也可以将其摆在服务器上面,这样看上去比较酷。

    View Code XML文件
    <?xml version="1.0" encoding="utf-8"?>
    <students>
      <student id="1">
        <name>张三</name>
        <phoneno>621380</phoneno>
        <login>true</login>
      </student>
      <student id="1">
        <name>李四</name>
        <phoneno>641234</phoneno>
        <login>true</login>
      </student>
      <student id="1">
        <name>王五</name>
        <phoneno>67890</phoneno>
        <login>false</login>
      </student>
    </students>

    本人将该文件student.xml放在自己机器上面的iis上面。当浏览器访问http://localhost/student.xml的时候即可以访问到。


    Object对象

    根据XML的数据及类型新建一个类,类的成员和XML的属性相对应,并且给类的成员生成get和set方法以及类的toString()方法方便显示结果。以下是一个实例:

    View Code Student类
    package com.xml.domain;
    
    public class Student {
        
        private int id;
        private String name;
        private String phone;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getPhone() {
            return phone;
        }
        public void setPhone(String phone) {
            this.phone = phone;
        }
        public boolean isLogin() {
            return login;
        }
        public void setLogin(boolean login) {
            this.login = login;
        }
        private boolean login;
        @Override
        public String toString() {
            return "Student [id=" + id + ", name=" + name + ", phone=" + phone
                    + ", login=" + login + "]";
        }
    
        
    }

    解析方法

    新建一个类(本人用例新建的是是DomService类),在类里面编写一个解析XML文件的方法。该方法使用DOM技术解析数据并且将XML文件转换为一个List集合。详细请看代码。

     1 //将XML转换为对象
     2 public List<Student> getStudents(InputStream inputStream) throws Exception {
     3     List<Student> list = new ArrayList<Student>();
     4     // 创建一个Document解析工厂
     5     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     6     DocumentBuilder builder = factory.newDocumentBuilder();
     7     // 将输入流解析为Document
     8     Document document = builder.parse(inputStream);
     9     // 整个文档就是一个节点文档 所以该节点就是所有内容
    10     Element ele = document.getDocumentElement();
    11     NodeList nodeList = ele.getElementsByTagName("student"); //获取所有student节点 并且进行遍历
    12     for (int i = 0; i < nodeList.getLength(); i++) {
    13         Element ele2 = (Element) nodeList.item(i); //具体的一个student节点
    14         Student student = new Student();
    15         student.setId(Integer.parseInt(ele2.getAttribute("id")));
    16         //获取student节点下面的所有子节点 并且进行遍历
    17         NodeList nodeList2 = ele2.getChildNodes();
    18         for (int j = 0; j < nodeList2.getLength(); j++) {
    19             if (nodeList2.item(j).getNodeType() == Node.ELEMENT_NODE) { //如果该节点是元素节点
    20                 if ("name".equals(nodeList2.item(j).getNodeName())) {
    21                     student.setName(nodeList2.item(j).getFirstChild()
    22                             .getNodeValue());
    23                 } else if ("phoneno".equals(nodeList2.item(j).getNodeName())) {
    24                     student.setPhone(nodeList2.item(j).getFirstChild()
    25                             .getNodeValue());
    26                 } else if ("login".equals(nodeList2.item(j).getNodeName())) {
    27                     student.setLogin(Boolean.parseBoolean(nodeList2.item(j)
    28                             .getFirstChild().getNodeValue()));
    29                 }
    30             }
    31         }
    32         list.add(student); //添加到集合
    33     }
    34     return list;
    35 }

    DOM解析要根据具体的XML结构进行代码编写。总体来说比较灵活而且比较容易理解。但是如果XML文件深度比较大的话,DOM解析的效率就会大大地降低。因为DOM的解析会随着深度而进行循环,多重循环的效率不高。所以不是很推荐,特别是XML很深的时候。

     


    HTTP请求

    由于本人将XML放在服务器上面,下面也说说如果用Java代码获取XML文件。我写了下面一个方法。

    View Code http请求方法
    // path为地址路径
    // 返回值将以流的形式返回
    public static InputStream getXML(String path) {
        InputStream inputStream = null;
        try {
            URL url = new URL(path);
            if (url != null) {
                HttpURLConnection connection = (HttpURLConnection) url
                        .openConnection();
                connection.setConnectTimeout(3000); // 设置超时时间为3秒
                connection.setDoInput(true);
                connection.setRequestMethod("GET"); // 设置请求方式
                int code = connection.getResponseCode(); // 接受返回码
                if (200 == code) { // 返回码为200为成功
                    inputStream = connection.getInputStream();
                }
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return inputStream;
    }

    下面我们就可以对服务器进行XML请求并且对XML解析了。

     


    测试结果

    在Main方法中编写

    public static void main(String[] args) {
        // TODO Auto-generated method stub
    
        String path = "http://localhost/student.xml";
        InputStream input = HttpUtils.getXML(path);
        DomService service = new DomService();
        try {
            List<Student> list = service.getStudents(input);
            for (Student student : list) {
                System.out.println(student.toString());
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
    }

    发布代码,得到结果

    Student [id=1, name=张三, phone=621380, login=true]
    Student [id=1, name=李四, phone=641234, login=true]
    Student [id=1, name=王五, phone=67890, login=false]

    完整项目代码下载:http://vdisk.weibo.com/s/uIkgX


    ------我是无聊的分割线-------

    以上是鄙人学习DOM解析和数据传输的过程。希望对您也能有所帮助。

     

    作者:Ron Ngai
    出处:http://rondsny.github.io
    关于作者:断码码农一枚。
    欢迎转载,但未经作者同意须在文章页面明显位置给出原文连接
    如有问题,可以通过rondsny#gmail.com 联系我,非常感谢。

  • 相关阅读:
    DataSingleton单例
    iOS平台XML解析类库对比和安装说明
    ASIHTTPRequest类库简介和使用说明
    IOS开发之格式化日期时间
    iOS多线程编程之NSThread的使用
    Django的Xadmin后台集成富文本Ueditor
    Django DEBUG=False后静态文件加载失败
    Python多进程
    linux平台虚拟环境依赖安装
    SQLite基础使用
  • 原文地址:https://www.cnblogs.com/rond/p/2976628.html
Copyright © 2011-2022 走看看