您的当前位置:首页Java(一)XML和JSON

Java(一)XML和JSON

来源:小侦探旅游网

XML和JSON

XML

什么是 XML?

  • XML 指可扩展标记语言(EXtensible Markup Language)
  • XML 是一种标记语言,很类似 HTML
  • XML 的设计宗旨是传输数据,而非显示数据
  • XML 标签没有被预定义。您需要自行定义标签
  • XML 被设计为具有自我描述性
  • XML 是 W3C 的推荐标准
  • XML也可以有其他形式存在,如:在内存中构建XML数据

无行为的 XML

**XML 是不作为的。**也许这有点难以理解,但是 XML 不会做任何事情。XML 被设计用来结构化、存储以及传输信息。

下面是 John 写给 George 的便签,存储为 XML:

<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

上面的这条便签具有自我描述性。它拥有标题以及留言,同时包含了发送者和接受者的信息。

但是,这个 XML 文档仍然没有做任何事情。它仅仅是包装在 XML 标签中的纯粹的信息。我们需要编写软件或者程序,才能传送、接收和显示出这个文档。

XML语法

XML 仅仅是纯文本

XML 没什么特别的。它仅仅是纯文本而已。有能力处理纯文本的软件都可以处理 XML。不过,能够读懂 XML 的应用程序可以有针对性地处理 XML 的标签。标签的功能性意义依赖于应用程序的特性。

XML 标签对大小写敏感

XML 元素使用 XML 标签进行定义。

XML 标签对大小写敏感。在 XML 中,标签 与标签 是不同的。

必须使用相同的大小写来编写打开标签和关闭标签:

<Message>这是错误的。</message>

<message>这是正确的。</message> 

注释:打开标签和关闭标签通常被称为开始标签和结束标签。不论您喜欢哪种术语,它们的概念都是相同的。

XML 必须正确地嵌套

在 HTML 中,常会看到没有正确嵌套的元素:

<b><i>这是一个没有正确嵌套的HTML代码</b></i>

在 XML 中,所有元素都必须彼此正确地嵌套:

<b><i>XML标签必须正确嵌套</i></b>

在上例中,正确嵌套的意思是:由于 元素是在 元素内打开的,那么它必须在 元素内关闭。

XML 文档必须有根元素

XML 文档必须有一个元素是所有其他元素的父元素。该元素称为根元素

<root>
  <child>
    <subchild>.....</subchild>
  </child>
</root>

XML 的属性值须加引号

与 HTML 类似,XML 也可拥有属性(名称/值的对)。

在 XML 中,XML 的属性值须加引号。下面的两个 XML 文档。第一个是错误的,第二个是正确的:

<note date=08/08/2008>
<to>George</to>
<from>John</from>
</note> 
<note date="08/08/2008">
<to>George</to>
<from>John</from>
</note> 

XML解析

XML的解析方式分为四种:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析。其中前两种属于基础方法,是官方提供的平台无关的解析方式;后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台。

解析本地xml文件案例

在本地项目中有一个Demo.xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<books>
    <book id="1001">
        <name>三国演义</name>
        <info>三国演义的简介</info>
    </book>
    <book id="1002">
        <name>西游记</name>
        <info>西游记的简介</info>
    </book>
</books>

使用DOM4J.JAR包进行解析。解析代码:

public class Demo1 {
    public static void main(String[] args) throws IOException, DocumentException {
        //1.创建文件输入流对象
        FileInputStream fis = new FileInputStream("Demo.xml");
        //2.创建XML读取对象
        SAXReader sr = new SAXReader();
        //3.读取并获得文档读取对象
        Document doc = sr.read(fis);
        //4.获取文档根元素
        Element root = doc.getRootElement();
        //5.解析xml:获取根源元素名称
        System.out.println(root.getName());

        //6.获取子节点内容
        Element book = root.element("book");//获取根节点下名为book的子节点
        Element name = book.element("name");//获取子节点book的name标记
        System.out.println(name.getText());//获取name标记包含的文本内容

        //7.解析文件里全部内容
        List<Element> es = root.elements();//获取根节点下全部子节点,并存入List集合
        for (int i = 0; i < es.size(); i++) {
            Element e = es.get(i);//获取List集合里的每一个子节点
            System.out.println(e.attributeValue("id"));//获取并输出子节点中名为id的属性
            System.out.println(e.elementText("name"));//获取并输出子节点的name标记中所包含的Text
            System.out.println(e.elementText("info"));//获取并输出子节点的info标记中所包含的Text
            System.out.println("------------");
        }
        fis.close();
    }
}

解析网络xml数据案例

调用juhe接口API查询手机号归属地。回转的XML:

<root>
<resultcode>200</resultcode>
<reason>Return Successd!</reason>
<result>
<province>山东</province>
<city>菏泽</city>
<areacode>0530</areacode>
<zip>274000</zip>
<company>移动</company>
<card/>
</result>
<error_code>0</error_code>
</root>

解析代码:

public class Demo2 {
    public static void main(String[] args) throws IOException, DocumentException {
        System.out.println("请输入需要查询的手机号:");
        String phoneNum = new Scanner(System.in).nextLine();
        //1.获取网络传输的xml输入流
        URL url = new URL("http://apis.juhe.cn/mobile/get? phone="+phoneNum
                +"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
        URLConnection urlConnection = url.openConnection();//建立连接
        InputStream is = urlConnection.getInputStream();//获取输入流

        //2.创建一个xml读取对象
        SAXReader sr = new SAXReader();

        //3.读取输入流,获取xml数据,并返回文档对象
        Document doc = sr.read(is);

        //4.获取根节点
        Element root = doc.getRootElement();

        //5.解析根节点内容
        String resultcode = root.elementText("resultcode");//响应状态码
        Element result = root.element("result");//响应结果集:归属地信息
        String province = result.elementText("province");//省份
        String city = result.elementText("city");//城市
        String company = result.elementText("company");//运营商

        if ("200".equals(resultcode)){
            //6.输出结果
            System.out.println("手机号:"+phoneNum+"的归属地信息为:");
            System.out.println("运营商:"+company);
            System.out.println("省份:"+province);
            System.out.println("城市:"+city);
        }else {
            System.out.println("查询失败!");
        }
    }
}

XPATH解析xml文件案例

解析本地Demo.xml文件,解析代码:

public class Demo3 {
    public static void main(String[] args) throws FileNotFoundException, DocumentException {
        //1.创建文件输入流对象
        FileInputStream fis = new FileInputStream("Demo.xml");
        //2.创建XML读取对象
        SAXReader sr = new SAXReader();
        //3.读取并获得文档读取对象
        Document doc = sr.read(fis);
        //4.通过Document和XPATH,寻找所有的name节点
        List<Node> names = doc.selectNodes("//name");

        //5.获取节点信息
        System.out.println("遍历所有节点的name标记:");
        for (int i = 0; i < names.size(); i++) {
            //获取标记名称
            System.out.print(names.get(i).getName()+":");
            //获取标记文本内容
            System.out.println(names.get(i).getText());
        }
        System.out.println("使用selectSingleNode()方法查询根节点下id属性值为1001的book节点:");
        Node node = doc.selectSingleNode("//book[@id='1001']//name");
        System.out.println(node.getName()+":"+node.getText());
    }
}

生成xml文件案例

生成代码:

public class Demo4 {
    public static void main(String[] args) throws IOException {
        //1.  通过文档帮助器 (DocumentHelper) , 创建空的文档对象          
        Document doc = DocumentHelper.createDocument();
        //2.  通过文档对象, 向其中添加根节点          
        Element root = doc.addElement("books");
        //3.  通过根节点对象root , 丰富子节点
        for (int i = 1; i <= 10; i++) {
            Element book = root.addElement("book");
            Element name = book.addElement("name");
            Element info = book.addElement("info");
            book.addAttribute("id",1000+i+"");
            name.setText("三国演义"+i);
            info.setText(name.getText()+"的简介");
        }
        //4.  创建一个文件输出流 ,用于存储XML文件
        FileOutputStream fos = new FileOutputStream("books.xml");
        //5.  将文件输出流, 转换为XML文档输出流
        XMLWriter xmlWriter = new XMLWriter(fos);
        //6.  写出文档
        xmlWriter.write(doc);
        //7.  释放资源
        fos.close();
    }
}

JSON

JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。XML也是一种数据交换格式,为什么没有选择XML呢?因为XML虽然可以作为跨平台的数据交换格式,但是在JS(JavaScript的简写)中处理XML非常不方便,同时XML标记比数据多,增加了交换产生的流量,而JSON没有附加的任何标记,在JS中可作为对象处理,所以我们更倾向于选择JSON来交换数据。

JSON的两种结构

JSON有两种表示结构,对象和数组。
对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔,语法结构如代码。

{
    key1:value1,
    key2:value2,
    ...
}

其中关键字是字符串,而值可以是字符串,数值,true,false,null,对象或数组

数组结构以”[”开始,”]”结束。中间由0或多个以”,”分隔的值列表组成,语法结构如代码。

[
    {
        key1:value1,
        key2:value2 
    },
    {
         key3:value3,
         key4:value4   
    }
]

认识JSON字符串

之前我一直有个困惑,分不清普通字符串,json字符串和json对象的区别。经过一番研究终于给弄明白了。比如在js中。

字符串:这个很好解释,指使用“”双引号或’’单引号包括的字符。例如:var comStr = ‘this is string’;
json字符串:指的是符合json格式要求的js字符串。例如:var jsonStr = “{StudentID:‘100’,Name:‘tmac’,Hometown:‘usa’}”;
json对象:指符合json格式要求的js对象。例如:

var jsonObj = { 
    StudentID: "100",
    Name: "tmac", 
    Hometown: "usa" 
};

因篇幅问题不能全部显示,请点此查看更多更全内容