XML解析和JSON解析学习

一、XML解析

1、xml简介

  • 一种标记语言,类似HTML
  • 宗旨传输数据,而非显示数据
  • 标签没有预定义,需要自己定义
  • 具有自我描述性
  • W3C推荐标准

2、xml与html对比

  • 不是它的替代品
  • 目的不同:
    • xml用来传输和存储数据,焦点是数据的内容
    • HTML显示数据,焦点为外观
    • 前者旨在显示信息,后者旨在传输信息

3、xml特点

  • 仅仅是纯文本
  • 没有预定义的标签,它允许创作者自己定义自己的标签和自己的文档结构

4、语法规则

  • 标签对大小写很敏感
  • 必须正确嵌套
  • 文档必须有根元素
  • 属性值需要加引号
  • 空格会被保留

5、DOM解析XML文件的内容

用DOM解析的方式读取一个xml文档中的属性,xml文档如下:

<?xml version="1.0" encoding="UTF-8"?>
<Languages cat="it">
<lan id="1">
    <name>Java</name>
    <ide>Eclipse</ide>
</lan>
<lan id="2">
    <name>Swift</name>
    <ide>Xcode</ide>
</lan>
<lan id="3">
    <name>C#</name>
    <ide>Visual Studio</ide>
</lan>
</Languages>

读取的代码如下所示:

try {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document =  builder.parse("languages.xml");
        Element root = document.getDocumentElement();
        NodeList node = root.getElementsByTagName("lan");

        System.out.println("cat="+root.getAttribute("cat"));

        for(int i = 0; i<node.getLength(); i++){
            Element lan = (Element) node.item(i);
            System.out.println("______________________________");
            System.out.println("id="+lan.getAttribute("id"));
            /*
            //这种方法一般不使用,内部元素如果有很多的话,需要写出很多,所以选择另一种方法
            Element name = (Element) lan.getElementsByTagName("name").item(0);
            System.out.println(name.getTextContent());
            */

            NodeList lanList = lan.getChildNodes();
            for(int j = 0; j<lanList.getLength(); j++){
                Node c = lanList.item(j);

                //API中getNodeName默认会把xml中的缩进符也作为节点,并打印出#text+空格的字样,此时就需要进行判断了
                //如果是Element对象再进行打印,不是就不打印出来
                if(c instanceof Element){
                    System.out.println(c.getNodeName()+"为"+c.getTextContent());
                }

            }
        }
    } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

要想创建一个同样效果的XML文件,DOM也可以完成,代码如下:

try {   
        //首先创建一个document对象
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.newDocument();

        //给document设置一个root的标题和属性
        Element root = (Element) document.createElement("Languages");
        root.setAttribute("cat", "it");

        //创建里面的几个节点lan1,lan2,lan3,并分别为他们设置属性
        Element lan1 = document.createElement("lan");
        lan1.setAttribute("id", "1");
        Element name1 = document.createElement("name");
        name1.setTextContent("java");
        Element ide1 = document.createElement("ide");
        //为ide1设置内容
        ide1.setTextContent("eclipse");
        //将name1和ide1追加到节点lan1上 
        lan1.appendChild(name1);        
        lan1.appendChild(ide1);

        Element lan2 = document.createElement("lan");
        lan2.setAttribute("id", "2");
        Element name2 = document.createElement("name");
        name2.setTextContent("swift");
        Element ide2 = document.createElement("ide");
        ide2.setTextContent("xcode");
        lan2.appendChild(name2);
        lan2.appendChild(ide2);

        Element lan3 = document.createElement("lan");
        lan3.setAttribute("id", "3");
        Element name3 = document.createElement("name");
        name3.setTextContent("c#");
        Element ide3 = document.createElement("ide");
        ide3.setTextContent("visual studio");
        lan3.appendChild(name3);
        lan3.appendChild(ide3);

        //将lan1、lan2、lan3追加到root节点上,并将根节点追加到文档中
        root.appendChild(lan1);
        root.appendChild(lan2);
        root.appendChild(lan3);
        document.appendChild(root);

        //将xml文档输出
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        StringWriter writer = new StringWriter();
        //此处可以输出为一个writer对象,也可以输出为一个文件
        transformer.transform(new DOMSource(document), new StreamResult(writer));
        transformer.transform(new DOMSource(document), new StreamResult(new File("newfile.xml")));

        System.out.println(writer.toString());
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (TransformerConfigurationException e) {
        e.printStackTrace();
    } catch (TransformerException e) {
        e.printStackTrace();
    }

}

6、了解Dom4j解析xml文档

首先下载和载入jar包,解析方法很简单,如下代码是将一串String类型的xml格式解析成document格式,几行代码就可以完成,关于dom4j的优点,在另一篇xml文档解析方法对比的博客中可以参考,后期自己参照api即可很方便的完成开发工作。

String xmlString = "<root><person>abcd</person></root>";
    try {
        Document document =  DocumentHelper.parseText(xmlString);
        System.out.println(document.asXML());
    } catch (DocumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

二、JSON解析

1、JSON简介

  • JavaScript对象表示法
  • 是存储和交换文本信息的语法
    • 轻量级的文本数据交换格式
    • 独立于语言和平台
    • 具有自我描述性,更易理解

2、JSON与XML

  • 类似XML,比XML更小、更快、更易解析

    • 没有结束标签
    • 更短
    • 读写速度更快
    • 使用数组
    • 不使用保留字

3、JSON语法

JSON其实是JavaScript对象表示法语法的子集

  • 数据在名称/值对中
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组

JSON值可以是:

  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true、false)
  • 数组(在方括号中)
  • 对象(在花括号中)
  • 也有null空值

4、JSON格式实例

Json对象在花括号中书写,对象可以包含多个名称/值对:

{"firstName":"john","lastName":"Doe"}

Json数组在方括号中书写,数组可以包含多个对象:

{
    "employees"{

        {"firstName":"john","lastName":"Doe"}
        {"firstName":"john","lastName":"Doe"}
        {"firstName":"john","lastName":"Doe"}
    }

}

5、采用gson的jar包进行json读写

JSON字符串如下:

{   
    "cat": "it",
    "languages": [
      {
        "id": "1","name": "Java","ide": "Eclipse"},
      {
        "id": "2","name": "Swift","ide": "Xcode"},
      {
        "id": "3","name": "C#","ide": "Visual Studio"}
        ],
    "pop":true
}

首先是读取JSON字符串,代码如下

//读取JSON格式的函数
public static void ReadJson(){
    try {
        JsonParser parser = new JsonParser();//解析器
        JsonObject object =  (JsonObject) parser.parse(new FileReader("json.json"));//parse()可以解析JSONReader、Reader和String类型
        System.out.println("cat="+ object.get("cat").getAsString());
        System.out.println("pop="+ object.get("pop").getAsBoolean());

        JsonArray array = object.get("languages").getAsJsonArray();
        for(int i =0;i<array.size();i++){
            System.out.println("---------------------------------------");
            JsonObject subObject = (JsonObject) array.get(i);
            System.out.println(subObject.get("id").getAsString());
            System.out.println(subObject.get("name").getAsString());
            System.out.println(subObject.get("ide").getAsString());
        }
    } catch (JsonIOException e) {
        e.printStackTrace();
    } catch (JsonSyntaxException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

然后是创建这样一个一样的JSON字符串,代码如下:

//创建JSON串
public static void CreateJson(){
    JsonObject object = new JsonObject();
    //添加第一个cat属性
    object.addProperty("cat", "it");
    //创建第二个属性JSON数组
    JsonArray array = new JsonArray();
    //分别创建并添加lan1、lan2、lan3 JSON对象到数组中
    JsonObject lan1 = new JsonObject();
    lan1.addProperty("id", "1");
    lan1.addProperty("name", "Java");
    lan1.addProperty("ide", "Eclipse");
    array.add(lan1);

    JsonObject lan2 = new JsonObject();
    lan2.addProperty("id", "2");
    lan2.addProperty("name", "Swift");
    lan2.addProperty("ide", "XCode");
    array.add(lan2);

    JsonObject lan3 = new JsonObject();
    lan3.addProperty("id", "3");
    lan3.addProperty("name", "C#");
    lan3.addProperty("ide", "Visio Studio");
    array.add(lan3);

    object.add("languages", array);
    //添加第三个值是布尔类型的属性
    object.addProperty("pop", true);

    System.out.println(object.toString());

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值