XML and JSON
软件与软件交流的语言
C语言和Java语言交流
后端是JAVA,客户端:C/GO/Python
不同的编程语言对象的组织格式不同
XML&JSON通常指的是字符串
JSON解析速度更快
- XML /JSON 具有平台(系统平台无关,语言解析看到的效果一样)无关性,是独立于编程语言的标记语言
- XML具有自我描述能力 (自己介绍自己)
Why XML&JSON?
JavaScript Object Notation:轻量级数据交换格式 (05/06年成为主流格式),机器解析快,数据传输快,程序猿解析起来也方便JavaScript test
对象格式:比如一本书,有书名,属性
eXtensible Markup Language:
- 用于网络数据传输
(比如通过一段数据发送明显有区别的内容:账户名 和 密码 或者发送JAVA对象? 【无法跨语言】
一般思路:比如用一些特殊符号拆分,但是如果账户名有特殊符号就会出错,有层次清晰的区分内容
) - 配置文件(配置程序所产生的缓存文件文件夹,切换数据库) 一般不需要写代码去解析文件,比如框架的配置文件
- 数据存储(多个软件产生的数据互通,比如头像的地址)
XML 文件 或者 XML语言?
.xml文件是保存数据的一种方式
XML数据也可以以其他方式存在(如存在内存中用于构建XML数据)
不要错误的以为xml语言就是XML文件
XML语法格式
标记(别名:元素/标签/节点)
- XML文档声明
<?xml version = "1.0" encoding = "utf-8"?>
- 开放标记/闭合标记
- 开放标记:<名称>
- 闭合标记:</名称>
- 标记内容:在开放标记 和 闭合标记之间的部分
自定义名称规则:
- name可以包含字母/数字/其他字符
- 不能以数字/标点符号开始
- 不能包含空格,冒号(:)
- 不能以字符“xml”开始(大小写均不可以)
- 名称是大小写区分的
- 标记允许嵌套 但是不能交叉
- 有且仅有一个根标记 就是最外层只能有一个树根标记
属性
1.标签的开始位置可以有多个属性(但属性不能重复),
2.但是属性内容必须被引号包裹,每个属性都是键值对
3.属性直接用空格隔开
<person id = "101" groupid = “1”>RichardWWHH</person>
注释
⚠️ 注释不可以在文档声明之前
⚠️ 注释不可嵌套
格式:
注释开始: <!--
注释结束: -->
CDATA
CDATA是不应该由XML解析的文本数据
比如说“<”会被视为新元素的开始,"&“会被视为字符实体开始,但是JavaScript中包含了大量的“<”,”&"
CDATA格式
开始: <![CDATA[
结束: ]]>
比如说:
<test>
<![CDATA[ Hello<&>Hello ]]>
</test>
nameSpace(命名空间)
限制标签的可扩展性,也可以解决标签名字在不同内容中冲突的情况
DOM4j包解析XML
- 创建一个XML文件的输入流
无论是网络的 或者是本地的XML
比如:我们的实例XML test.xml存在Desktop中
<books>
<book id="101">
<name>Lord of Rings</name>
<info>Tells nothing</info>
</book>
<book id="102">
<name>Old man and Sea</name>
<info>Fishing</info>
</book>
</books>
那么我们的解析代码如下:
1.创建
String path = "Desktop/test.xml"
FileInputStream fileInputStream = new FileInputStream(new File(path));
- 创建XML读取工具对象
SAXReader sax = new saxReader();
- 借助读取工具对象,读入XML的输入流,获得文档对象
Document doc = sax.read(fis);
- 获得文档对象,读取文档中的root元素对象
Element root = doc.getRootElement();
System.out.println(root.getName());//空
- 操作root对象中的Element 字段 对元素层级对象进行读取
Element book = root.element("book");
Element name = book.element("name");
//getText() 方法获取元素的内容
System.out.println(name.getText());//Lord of Rings
//从根结构开始遍历XML 文档
List<Element> xmlList = root.elements();
for(Element e : xmlList) {
//通过Element对象的attributeValue() 和 elementText
//去访问属性值 和 内容
System.out.println("Book ID: " + e.attributeValue("id"));
System.out.println("Book name: " + e.elementText("name"));//直接获取 指定的 子元素的内容
System.out.println("Book info: " + e.elementText("info"));
System.out.println("---------");
}
- 不同语言中 对象格式 的不同之处
var book = new Object();
book.name = "Old man and sea";
book.info = "Fishing";
VS JAVA
//创建一个Book类,new对象
public class Main {
static class Book {
private String name;
private String info;
}
public static void main(String[] args) {
Book book = new Book();
book.setName("Old man and sea");
book.setInfo("Fishing");
}
}
VS XML
<book>
<name>"Old man and sea"</name>
<info>"Fishing"</info>
</book>
VS JSON(名称外部的引号可以省略,但是JAVA解析会出现问题,最好不要省略)
元素值:字符串加上引号
{
”name“: "Old man and sea",
“info”: "Fishing"
}
JSON 存取和序列化操作的 jar包
GSON:
FastJSON: