XML与Json解析

目录

XML解析 

一、DOM4J解析XML文件(非重点):

二、Dom4J之XPATH解析XML(非重点)

 三、生成XML

 Json解析(重点)


XML解析 

解析网络xml文件:这里我们提供一个网址:

在浏览器中粘贴此网址,将“+phone+”换成手机号即可得到一个xml文件。"http://apis.juhe.cn/mobile/get%20phone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253"

一、DOM4J解析XML文件(非重点):

一:步骤:

 1. 引入jar文件 dom4j.jar
 2. 创建一个指向XML文件的输入流
     FileInputStream fis = new FileInputStream("xml文件的地址");
 3. 创建一个XML读取工具对象
     SAXReader sr = new SAXReader();
 4. 使用读取工具对象, 读取XML文档的输入流 , 并得到文档对象
     Document doc = sr.read(fis);  
 5. 通过文档对象, 获取XML文档中的根元素对象
     Element root = doc.getRootElement();

示例:

我随意输入一个手机号,粘贴到浏览器:

http://apis.juhe.cn/mobile/getphone=13384995237&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253

可以得到此xml文件: 

 

 下面我们来解析这个xml文件(请认真看详细注释)

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
public class Demo2 {
    public static void main(String[] args) throws IOException, DocumentException {
        String phone = "13384995237";
        //URL是网络地址,全球通用
        URL url = new URL("http://apis.juhe.cn/mobile/get?%20phone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
        //打开网址连接
        URLConnection connection = url.openConnection();
        //获取流
        InputStream is = connection.getInputStream();
        //创建一个XML对象用来读取流
        SAXReader rs = new SAXReader();
        //通过读取对象,读取XML数据,并返回文档对象
        Document doc = rs.read(is);
        //用文件获取根节点
        Element root = doc.getRootElement();
        //用根节点获取子节点
        Element resultcode = root.element("resultcode");
        Element result = root.element("result");
        System.out.println("输出的result的内容为:"+result.getText());
        /**
         * 这里输出为空,因为result下面只有子节点,并没有自身内容
          */
        //用result获取子节点province
        Element province = result.element("province");
        //获取province内容
        System.out.println("手机号所属省份:"+province.getText());
        //用result获取子节点city并获取内容
        System.out.println("手机号所属市区:"+result.element("city").getText());
        }
    }

运行结果 : 

 以上和以下大家可以参考元素对象的常用方法:

//解析所有子节点
        List<Element> es = root.elements();
        for (int i=0;i<es.size();i++){
            System.out.println("节点名称:"+es.get(i).getName());
            System.out.println("节点内容:"+es.get(i).getText());
            System.out.println("--------------------------------");
        }

result节点是root的子节点,内容依然为空。 

 

 我们解析以下子节点result下面的子节点:

List<Element> es1 = result.elements();
        for (int i=0;i<es1.size();i++)
        {
            System.out.println("result的子节点名称:"+es1.get(i).getName());
            System.out.println("result的子节点内容:"+es1.get(i).getText());
        }

 结果:

 结合最开始的xml文件:我们可以知道橘色标记为root的子节点,而绿色标记为result子节点 

二、Dom4J之XPATH解析XML(非重点)

XPATH是用路径表达式来解析文件。

 books
        book id=1
                name
                info
        book id=2
                name
                info

通过路径快速的查找一个或一组元素
路径表达式:
 1. /  :  从根节点开始查找
 2. // :  从发起查找的节点位置 查找后代节点 ***  (最常使用)
 3. .  :  查找当前节点
 4. .. :  查找父节点
 5. @  :  选择属性. * 
       属性使用方式:
       [@属性名='值']
       [@属性名>'值']
       [@属性名<'值']
       [@属性名!='值']

eg:查询id=1的book的name:
 books:  路径: //book[@id='1']//name
 

常用方法是路径表达式2

eg:拿到文档对象,即可操作。

结果: 

 三、生成XML

一、步骤:

1. 通过文档帮助器 (DocumentHelper) , 创建空的文档对象
     Document doc = DocumentHelper.createDocument();
 2. 通过文档对象, 向其中添加根节点
     Element root = doc.addElement("根节点名称");
 3. 通过根节点对象root , 丰富我们的子节点
     Element e = root.addElement("元素名称");
 4. 创建一个文件输出流 ,用于存储XML文件
     FileOutputStream fos = new FileOutputStream("要存储的位置");
 5. 将文件输出流, 转换为XML文档输出流
     XMLWriter xw = new XMLWriter(fos); 
 6. 写出文档
     xw.write(doc);
 7. 释放资源
     xw.close();

eg:我们现在写一个book类:

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo4 {
    public static void main(String[] args) throws IOException {
        //通过文档帮助器,创建一个文档对象
        Document doc = DocumentHelper.createDocument();
        //给文档添加一个根节点
        Element books = doc.addElement("books");
        //给根节点添加子节点
        for (int i=0;i<100;i++){
            Element book = books.addElement("book");
            //给子节点添加内容
            Element name = book.addElement("name");
            name.setName("第"+i+"本书");
            Element info = book.addElement("info");
            info.setText("第"+i+"个内容");
            //创建一个属性
            book.addAttribute("id",100+i+"");
        }
        //创建一个文件输出流,将文件存入d盘
        FileOutputStream os = new FileOutputStream("d://books.xml");
        /*可以存入c盘,我的c盘有权限无法存入,于是选择d
        * */
        XMLWriter xm = new XMLWriter(os);
        xm.write(doc);
        xm.close();
    }
}

结果:d盘中

 打开后:生成的xml文件

 但其实我们一般都不是自己创建节点,自己去创建一个XML文件。

一般情况下我们都是获得一个对象,再将对象封装为XML文档。而这里,我们也提供了一个工具---xstream

eg:写一个Person类

static class Person{
       private String name;
       private int age;
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Person person = (Person) o;
            return age == person.age && Objects.equals(name, person.name);
        }
        @Override
        public int hashCode() {
            return Objects.hash(name, age);
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
        public Person() {
        }
    }

main方法里转换xml文件

public static void main(String[] args) {
        Person p = new Person();
        p.setAge(18);
        p.setName("白日梦想家");
        //创建XStream对象
        XStream xs = new XStream();
        //修改某个类型生成的节点(可选的,默认为包名.类名)
        xs.alias("Person",Person.class); //把Person类更改为Person节点,也就是说,创建一个Person类对象,根节点就是Person
        //传入对象,开始生成
        String xml = xs.toXML(p);
        System.out.println(xml);
    }

结果:

 Json解析(重点)

一、Json格式:

一个对象, 由一个大括号表示.
   括号中 描述对象的属性 . 通过键值对来描述对象的属性
   (可以理解为, 大括号中, 包含的是一个个的键值对.)
   格式:
键与值之间使用冒号连接, 多个键值对之间使用逗号分隔.
键值对的键 应使用引号引住 (通常Java解析时, 键不使用引号会报错. 而JS能正确解
析.)
键值对的值, 可以是JS中的任意类型的数据

eg:

{
        "name":"白日梦想家",
        "age":19,
        "book":["语文","数学","英语"{
              "name":"好好学习",
              "info":"天天向上"
           }],
        "heihei":{
          "zuoji":"摩托车",
          "method":"油"
       }
     }

这段话的意思就是:{}里是一个对象,对象名字“白日梦想家”,年龄19,对象的书籍:是一个数组,有语数英和一个新对象{名字“好好学习”,内容“天天向上”}。总对象还有“heihei”属性,里面又是一个对象。。。

所以由此可以看出来,Json没有什么层级格式,对象包含对象,包含数组,里面又有对象等等。。

解析Json

共有两种方式:1、谷歌的Gson

                         2、阿里的FastJson

这两个都可以在网上直接搜到,点入Github开源地址,可以直接下载jar文件。

Gson解析Json

转换JSON字符串的步骤:
  1.  引入JAR包
  2.  在需要转换JSON字符串的位置编写如下代码即可:
    String json = new Gson().toJSON(要转换的对象);

3.Json转文件的关键字:fromJson

eg:将对象转换成Json模式

现创建一个Book类,后面要用对象

import java.util.Objects;
public class Book {
    int id;
    String name;
    String info;
    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", info='" + info + '\'' +
                '}';
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Book book = (Book) o;
        return id == book.id && Objects.equals(name, book.name) && Objects.equals(info, book.info);
    }
    @Override
    public int hashCode() {
        return Objects.hash(id, name, info);
    }
    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 getInfo() {
        return info;
    }
    public void setInfo(String info) {
        this.info = info;
    }
    public Book(int id, String name, String info) {
        this.id = id;
        this.name = name;
        this.info = info;
    }
    public Book() {
    }
}

转换: 

public class Demo1 {
    public static void main(String[] args) {
        //创建Json对象
        Gson g = new Gson();
        //将对象转化成Json格式
        Book b= new Book(100,"摩托车","毕业后买摩托车");
        String s = g.toJson(b);
        System.out.println(s);
    }
}

结果: 

eg2:将Json再转换为对象(或数组):

{"id":100,"name":"摩托车","info":"毕业后买摩托车",page:["锄禾日当午","汗滴禾下土","谁知盘中餐"]}

格式:fromJson(“Json”,转化后的对象类型)

转对象:

        Gson g = new Gson();
        //将json格式转换成对象
        g.fromJson("{\"id\":100,\"name\":\"摩托车\",\"info\":\"毕业后买摩托车\"}",Book.class);
        System.out.println(b.getId());
    }

 

转数组:

public static void main(String[] args) {
        Gson g = new Gson();
        //将Json转化为数组
        HashMap hashMap = g.fromJson("{\"id\":100,\"name\":\"摩托车\",\"info\":\"毕业后买摩托车\",page:[\"锄禾日当午\",\"汗滴禾下土\",\"谁知盘中餐\"]}", HashMap.class);
        System.out.println(hashMap.get("id"));
        System.out.println(hashMap.get("name"));
        System.out.println(hashMap.get("info"));
        System.out.println(hashMap.get("page").getClass()); //输出class发现,属于ArrayList集合
        List page = (List) hashMap.get("page");
        System.out.println(page.get(0));
        System.out.println(page.get(1));
        System.out.println(page.get(2));
    }

 

结果:

 

 FastJson解析Json

转换JSON字符串的步骤:
  1.  引入JAR包
  2.  在需要转换JSON字符串的位置编写如下代码即可:
    String json=JSON.toJSONString(要转换的对象);

eg:将对象转换成Json模式

public static void main(String[] args) {
        Book b= new Book(102,"小汽车","毕业后买小汽车");
        //只需要一步:转换
        String json = JSON.toJSONString(b);
        System.out.println(json);
    }

结果:

 将Json转化为对象(或数组)

转对象:

 public static void main(String[] args) {
        //{"id":102,"info":"毕业后买小汽车","name":"小汽车"}
        //转对象:
        Book book = JSON.parseObject("{\"id\":102,\"info\":\"毕业后买小汽车\",\"name\":\"小汽车\"}",Book.class);
        System.out.println(book.getId());
        System.out.println(book.getInfo());
    }

结果:

转数组:

public static void main(String[] args) {
        //转换成数组(String类型的集合)
        //["123","456","789"]
        List<String> strings = JSON.parseArray("[\"123\",\"456\",\"789\"]", String.class);
        System.out.println(strings.get(1));
    }

 结果:

到这里呢,全部内容就结束了。有什么问题,欢迎留言~ 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XMLJSON是两种常用的数据传输格式。XML是可扩展标记语言(Extensible Markup Language)的缩写,它使用标记来表示数据的结构和内容。XML解析通常包括解析器和DOM或SAX两种解析方式,其中DOM方式将整个XML文档加载到内存中,以树结构的形式表示,而SAX方式则是在解析过程中逐行读取XML文档并触发相应的事件。 JSONJavaScript对象表示法(JavaScript Object Notation)的缩写,它是一种轻量级的数据交换格式。JSON使用简洁的键值对的形式来表示数据,并且易于阅读和编写。在解析JSON格式数据时,可以使用各种编程语言中提供的JSON库或框架,如Java中的Gson或FastJson。这些库可以将JSON字符串解析为对象或将对象转换为JSON字符串。 XMLJSON都有各自的优缺点。XML的优点是结构清晰,可扩展性强,适用于复杂的数据结构。但是XML的缺点是冗余性较高,数据量较大,解析速度相对较慢。JSON的优点是体积小,解析速度快,适合在网络传输中使用。然而,JSON的缺点是可读性较差,不支持注释。 在项目中,XMLJSON格式的数据解析常用于数据交换和传输。通过解析XMLJSON格式的数据,我们可以获取并处理其中的内容,从而实现对数据的操作和分析。具体使用哪种格式取决于项目需求和技术栈的选择。例如,如果项目需要与其他系统进行数据交互,可能会使用XML格式;如果项目使用的是前端框架或后端语言支持JSON格式,那么可能会选择使用JSON格式进行数据解析。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [XMLJSON格式数据解析方法](https://blog.csdn.net/qq_35523015/article/details/81053662)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [jsonxml格式数据的解析java代码+相关的jar包)](https://download.csdn.net/download/zdd1065493823/10335380)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [XMLJSON 解析教程](https://blog.csdn.net/weixin_44715733/article/details/114749650)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值