目录
XML是一个可扩展的标记语言.(eXTENsible Markup language XML) 很类似于是HTML. HTML是有自己固定的标签,XML是自己定义的.XML主要作用是用来传输数据的, HTML主要用来显示数据的.所以XML不能替代HTML.
XML是一个倒立的树形结构. 我们可以使用JAVA创建一个 文件(FILE) -> 新建 ->其它(other) 或者CTRL +N 出现以下界面.
我们选择XML file即可. 创建完毕之后的结果
下方有两种显示方式,第一种就是我们的表格形式,第二种就是源码形式. 第二种:
第一行代码,说明了 XML的文件头. 说明了XML的版本,以及编码. 最基本的XML代码
<?xml version="1.0" encoding="UTF-8"?>
<MyClient>
<Client1>
<ClientId>1</ClientId>
<ClientName> tom</ClientName>
<age>12</age>
</Client1>
<Client2>
<ClientId>2</ClientId>
<ClientName> Jason </ClientName>
<age>14</age>
</Client2>
</MyClient>
首先有一个根节点,叫做 MyClient 写法是: 这个是根节点 根节点中有两个子节点. 每个子节点有自己各有的属性, 例如子节点 Client1 跟 Client2 下面就是属性了,属性我们可以给值,或者继续添加子节点.我们切换成列表模式查看.
所以可以看图表,可以得出,XML是一个数节点管理模式.
1.节点. 节点就是我们自己定义的根节点,如上面的定义的MyClient 2.元素跟标签,元素跟标签是我们自己定义的,比如我们的 MyClient Client1等可以说做标签.或者元素. 3.文本内容, 文本内容就是元素后面的内容,比如我们输入的 文本,如上面代码的 jason 12 等等都是 4.属性. 属性是放在元素里面了. 例如 后面的ID放到元素里面了并赋值,就是属性 如下,如果我们给了属性,那么列表视图就会改变.
可以看到,属性哪里已经有我们给的属性名称.以及颜色变成绿色. 后面跟着的1就是我们的属性值.
上面我们编写了一个简单的XML文件.但是它也是有规则的. 1.必须有一个根元素才可以. 例如上面我们写的(MyClient) 2.文档必须有关闭标签,我们在编写XML的时候都有开始标签跟结束标签,例如 一个开始标签,一个结束标签. 3.标签大小写敏感, 开始标签的大小写.跟结束标签必须大小写一样. 4.结构必须正确的嵌套, 比如我们
<MyClient>
<Client1>
</MyClient>
</Client1>
这样就是错误的 必须正确的嵌套才可以. MyCliet开始标签在前边,那么最后也要是MyClient,一一对应的关系. 我们写的任何内容都是在他们之前.所以结束标签不会再中间的.
什么是XML解析,我们说过,XML是一个文本文档.只不过有一定的格式.是用来存储数据的.我们第一个标题中就写了一个简单的XML文件. 那么既然他是存储数据的,那么就要读取出来才可以.怎么进行读取,就是本标题所讲的XML解析. JAVA中也提供了XML文档解析API. Android中也有.XML一般是配置信息的.或者在C/S结构中用来传输数据的. javax.xml.parsers 中有解析XML的类
一个基于文档的 DOCumentBuilderFactory 一个是基于事件的. SAXparser类. doc类是全部加载进去, SAX是逐行读取. JAVA代码解析XML 1.首先编写一个简单的XML文件, 编写图书管理的XML文件
<?xml version="1.0" encoding="UTF-8"?>
<MyBooks>
<Book>
<id>1001</id>
<name>Android</name>
<price>100</price>
</Book>
<Book>
<id>1002</id>
<name>IOS</name>
<price>45.50</price>
</Book>
<Book>
<id>1003</id>
<name>C++</name>
<price>56.7</price>
</Book>
</<MyBooks>>
2.建立与之对象的类. 与元素相对应.
package com.xml;
public class BookOpt {
private int id;
private String name;
private float price;
public BookOpt() {
// TODO 自动生成的构造函数存根
}
}
Set Get方法自动生成即可.这里不贴代码了.
3.Doc代码解析XML文件
public static void ParseWithDoument() throws Exception {
//1.doc解析
/*
解析思路:
1.使用Doc类进行解析,首先创建工厂对象
2.使用工厂对象创建DocBuider
3.使用DocumentBuilder的方法 parse(xml路径) 可以获得完整的XML文件内容
4.完成的XML文件内容使用Document进行接收
5.使用Document中的 getDocumentElement();可以获得XML的根节点
6.根节点的方法getElementsBytagName(子节点) 传入子节点可以获取子节点的所有内容
7.所有子节点使用NodeList进行接收存储.只需要进行遍历即可得出每个子节点的内容.
8.每一个节点是一个NODE类型.可以使用item(i)获取每一个节点
9.子节点中也有子节点,可以使用getChildNodes()获取子节点中所有节点,还是NodeList保存
10.使用节点中的 getNodeName()可以获取子节点的名称
11.通过判断子节点的名称来设置对应的值. 获取值使用 getFirseChild().getNodeValue();即可.
*/
public static void ParseWithDoument() throws Exception {
//1.doc解析
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//使用工厂类,创建一个factory
DocumentBuilder buider = factory.newDocumentBuilder(); //获得一个doc实例
Document doc = buider.parse("NewFile.xml"); //传入XML路径,返回解析后的Doc类.
NodeList Items = doc.getElementsByTagName("Book");//获取了所有BOOK节点
for(int i = 0; i < Items.getLength();i++) {
//获取子节点
Node nodes = Items.item(i); //要从子节点中继续获取节点
NodeList ChildNodes = nodes.getChildNodes(); //如果有子节点就是用这个
BookOpt Book = new BookOpt();
for(int j = 0; j < ChildNodes.getLength();j++) {
Node ChildNode = ChildNodes.item(j);
String TagName = ChildNode.getNodeName();
//判断标签是哪个名字
if(TagName.equals("id")) {
String Id = ChildNode.getFirstChild().getNodeValue();
Book.setId(Integer.parseInt(Id));
}else if(TagName.equals("name")) {
String name = ChildNode.getFirstChild().getNodeValue();
Book.setName(name);
}else if(TagName.equals("price")) {
String Price = ChildNode.getFirstChild().getNodeValue();
Book.setPrice(Float.parseFloat(Price));
}
}
System.out.println(Book);
}
}
}
实现结果:
对于大文档,解析效率非常低.因为所有XML都读取到内存中. 掌握上面的方法其实掌握树形结构以及节点就可以.
上面说的使用文档进行定位,我们还可以使用Java带了Xpath来定位.给一个路径就可以定位. 代码如下:
private static void parseXpath()throws Exception {
// TODO 自动生成的方法存根
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse("NewFile.xml");
XPath path = XPathFactory.newInstance().newXPath();
String ePath = "/MyBooks/Book[1]/id";
System.out.println(path.evaluate(ePath, doc,XPathConstants.STRING));
}
1.首先创建DocumentBuilder对象.因为要获取完整的DocXML文档.都是使用工厂方法创建 2.使用XPath,xPath也是工厂创建 3.指定一个XML下面的路径. /根目录/子节点[xxx]/标签(元素); 这样就可以直接获得. 4.使用Xpath的方法 evaluate方法. 传入路径, 以及XML的内存.传入常量String代表返回的是Strign显示. 5.最后运行就可以直接获取了.