一、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());
}