XML:XML是一种可标记语言,其特性如下:
1.平台性,一门独立的标记语言。比如XML进行解析时,在不同系统中的表现形式相同。
2.自我描述性。
1 网络的数据传输
2 数据存储
3 配置文件
.xml文件是保存XML数据的一种方式,xml数据可以从其他的方式存在。
XML声明是XML文档的第一句,其格式如下:
<?``xml` `version``=``"1.0"` `encoding``=``"utf-8"``?>
在XML文档中,大小写是有区别的。“A”和“a”是不同的标记。注意在写元素时,前后标记的大小写要保持一致。最好养成一种习惯,或者全部大写,或者全部小写,或者大写第一个字母,这样可以减少因为大小写不匹配而产生的文档错误。 [4]
良好格式的XML文档必须有一个根元素,就是紧接着声明后面建立的第一个元素,其他元素都是这个根元素的子元素,根元素完全包括文档中其他所有的元素。根元素的起始标记要放在所有其他元素的起始标记之前;根元素的结束标记要放在所有其他元素的结束标记之后。
在HTML代码里面,属性值可以加引号,也可以不加。但是XML规定,所有属性值必须加引号(可以是单引号,也可以是双引号,建议使用双引号),否则将被视为错误。
在HTML中,标记可以不成对出现,而在XML中,所有标记必须成对出现,有一个开始标记,就必须有一个结束标记,否则将被视为错误。
空标记是指标记对之间没有内容的标记,比如“”等标记。在XML中,规定所有的标记必须有结束标记。
以下是正确例子:
<person>
<name>李四</name>
<age>18</age>
</person>
sax解析是一种以事件驱动机制为方式的解析
它通过逐行读取xml文件解析。每当触碰到标签开始、内容、属性、结束事件时,我们可以编写程序在这些事件发生时进行相应处理。
DOM解析是用与平台和语言无关的方式表示XML文档的w3c标准。该结构下的分析通常需要加载整个文件,在内存中建立文档树模型。程序员能在文档树下完成数据获取、删除、修改。
特征:
1、仅使用具体类,而不使用接口。
2、API大量使用了Collections类。
特征:
1、JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能。
2、它使用接口和抽象基本类方法。
3、具有性能优异、灵活性好、功能强大和极端易用的特点。
4、是一个开放源码的文件
总结四个解析:DOM4J性能最好,连Sun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J。
JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM。虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在JavaScript中使用DOM)。
SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。
1.解析本地文件
public static void main(String[] args){
//1.获取输入流
FileInputStream fis = new FileInputStream(name:xml文件);
//2.创建xml读取对象
SAXReader sr = new SAXReader();
//3.读取并得到文档对象
Document doc = sr.read(fis);
//4.通过文档获取根元素
Element root = doc.getRootElement();
//5.开始解析元素
system.out.println(root.getName);
fis.close;
}
2.解析网络文件
String phone = "12345678910";
//1. 获取到XML资源的输入流
URL url = new URL("http://apis.juhe.cn/mobile/getphone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
//2. 创建一个XML读取对象
SAXReader sr = new SAXReader();
//3. 通过读取对象读取XML数据,并返回文档对象
Document doc = sr.read(is);
//4. 获取根节点
Element root = doc.getRootElement();
//5. 解析内容
String code = root.elementText("resultcode");//将查询成功内容取出
if("200".equals(code)){
Element result = root.element("result");
String province = result.elementText("province");
String city = result.elementText("city");
if(province.equals(city)){
System.out.println("手机号码归属地为:"+city); }
else{
System.out.println("手机号码归属地为:"+province+" "+city);
}
}
else{
System.out.println("请输入正确的手机号码");
}
通过路径快速的查找一个或一组元素 路径表达式:
1. / : 从根节点开始查找
2. // : 从发起查找的节点位置 查找后代节点 *** 3. . : 查找当前节点
4. .. : 查找父节点
5. @ : 选择属性. *
属性使用方式:
[@属性名='值']
[@属性名>'值']
[@属性名<'值']
[@属性名!='值']
books:
路径: //book[@id='1']//name books
book id=1
name
info
book id=2
name
info
步骤:
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();
案例:
//1. 通过文档帮助器, 创建空的文档对象
Document doc = DocumentHelper.createDocument();
//2. 向文档对象中, 加入根节点对象
Element books = doc.addElement("books");
//3. 向根节点中 丰富子节点
for(int i=0;i<1000;i++) {
//向根节点中加入1000个book节点.
Element book = books.addElement("book");
//向book节点, 加入id属性
book.addAttribute("id", 1+i+"");
//向book节点中加入name和info节点
Element name = book.addElement("name");
Element info = book.addElement("info");
name.setText("苹果"+i);
info.setText("哈哈哈"+i); }
//4. 创建文件的输出流
FileOutputStream fos = new FileOutputStream("c:\\books.xml");
//5. 将文件输出流, 转换为XML文档输出流
XMLWriter xw = new XMLWriter(fos);
//6. 写出XML文档
xw.write(doc);
//7. 释放资源
xw.close();
System.out.println("代码执行完毕");
快速的将Java中的对象, 转换为XML字符串.
使用步骤:
对象格式
1. 创建XStream 对象
XStream x = new XStream();
[2].修改类生成的节点名称(默认节点名称为包名.类名)
x.alias("节点名称",类名.class);
3. 传入对象,生成XML字符串
String xml字符串= x.toXML(对象);
案例:
Person p = new Person(1001, "张三", "不详");
XStream x = new XStream();
x.alias("haha", Person.class);
String xml = x.toXML(p);
System.out.println(xml);
JSON:JS对象简谱, 是一种轻量级的数据交换格式,是存储和交换文本信息的语法,类似 XML。
JSON 比 XML 更小、更快,更易解析。
{
"sites": [
{ "name":"book1" , "url":"www.book1.com" },
{ "name":"book2" , "url":"www.book2.com" },
{ "name":"book3" , "url":"www.book3.com" }
]
}
其中,sites 对象是包含 3 个站点记录(对象)的数组。
JSON 文本格式在语法上与创建 JavaScript 对象的代码相同。
由于这种相似性,无需解析器,JavaScript 程序能够使用内建的 eval() 函数,用 JSON 数据来生成原生的 JavaScript 对象
JSON 语法是 JavaScript 对象表示语法的子集。
JSON 数据的书写格式是:
key : value
名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:
"name" : "book"
这很容易理解,等价于这条 JavaScript 语句:
name = "book"
JSON 值可以是:
JSON 数字可以是整型或者浮点型:
{ “age”:30 }
JSON 对象在大括号 {} 中书写:
{key1 : value1, key2 : value2, ... keyN : valueN }
对象可以包含多个名称/值对:
{ "name":"菜鸟教程" , "url":"www.runoob.com" }
这一点也容易理解,与这条 JavaScript 语句等价:
name = "菜鸟教程" url = "www.runoob.com"
JSON 数组在中括号 [] 中书写:
数组可包含多个对象:
[
{ key1 : value1-1 , key2:value1-2 },
{ key1 : value2-1 , key2:value2-2 },
{ key1 : value3-1 , key2:value3-2 },
...
{ keyN : valueN-1 , keyN:valueN-2 },
]
{ "sites": [ { "name":"菜鸟教程" , "url":"www.runoob.com" }, { "name":"google" , "url":"www.google.com" }, { "name":"微博" , "url":"www.weibo.com" } ] }
在上面的例子中,对象 sites 是包含三个对象的数组。每个对象代表一条关于某个网站(name、url)的记录。
JSON 布尔值可以是 true 或者 false:
{ "flag":true }
JSON 可以设置 null 值:
{ "runoob":null }
因为 JSON 使用 JavaScript 语法,所以无需额外的软件就能处理 JavaScript 中的 JSON。
通过 JavaScript,您可以创建一个对象数组,并像这样进行赋值:
实例
var sites = [ { "name":"runoob" , "url":"www.runoob.com" }, { "name":"google" , "url":"www.google.com" }, { "name":"微博" , "url":"www.weibo.com" } ];
可以像这样访问 JavaScript 对象数组中的第一项(索引从 0 开始):
sites[0].name;
返回的内容是:
runoob
可以像这样修改数据:
sites[0].name="菜鸟教程";