1.什么是XML
-
-
XML 是一种标记语言,很类似 HTML
-
XML 的设计宗旨是传输数据,而非显示数据(webservice)
-
XML 标签没有被预定义。您需要自行定义标签。
-
XML 被设计为具有自我描述性。
-
XML 是 W3C 的推荐标准
-
XML可以存储数据(小型数据库)
-
XML可以作为框架的配置问 web.xml applicationContext.xml(spring的配置文件) ,hibernate.cfg.xml
2.XML与HTML的主要区别
- XML 和 HTML 为不同的目的而设计:
- XML 被设计为传输和存储数据,其焦点是数据的内容。
- HTML 被设计用来显示数据,其焦点是数据的外观。
- HTML 旨在显示信息,而 XML 旨在传输信息。
3.XML语法
- XML 元素都须有关闭标签<student> </student>
- XML 文档必须有根元素
- XML 的属性值须加引号
4.XML命名规则
-
名称可以含字母、数字以及其他的字符
-
名称不能以数字或者标点符号开始
-
名称不能以字符 “xml”(或者 XML、Xml)开始
-
名称不能包含空格
可使用任何名称,没有保留的字词。
5.特殊字符
< | "<" | 小于 |
> | > | 大于 |
& | & | 和号 |
' | ' | 单引号 |
" | " | 引号 |
2.XML解析
文档:
根据xml文件创建对应的类
3.Dom4解析
3.1什么是Dom4j
3.2 核心类
SAXReader Demo4读取文件的类
read 读取指定的xml文件
Document 文档类 用于加载指定的文档
常用方法:
getRootElement 获取根节点
Element 标签类,元素
常用方法:
elements 获取所有的直接子标签
attribute 获取指定属性名称的属性对象
elementText 获取指定子标签名称的文本内容
element 获取指定标签名称的标签对象
getText(); 得到当前标签中间的文本
3.3 实现xml解析
4.SAX解析
4.1 什么是SAX
SAX,全称Simple API for XML,既是一种接口,也是一种软件包。它是一种XML解析的代替方法。SAX不同于DOM解析,它逐行扫描文档,一边扫描一边解析。由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势
dom:把XML文件读取到内容,构建树形结构
-
SAX的优点:
-
解析速度快
-
占用内存少
-
-
SAX的缺点:
-
无法知道当前解析标签(节点)的上层标签,及其嵌套结构,仅仅知道当前解析的标签的名字和属性,要知道其他信息需要程序猿自己编码
-
只能读取XML,无法修改XML
-
无法随机访问某个标签(节点)
-
-
SAX解析适用场合
SAX解析适用场合 对于CPU资源宝贵的设备,如Android等移动设备对于只需从xml读取信息而无需修改xml
4.3 代码实现
创建自定义处理数据的模板类
继承DefaultHandler类
重新四个方法
startDocument();解析到xml文件的开始
startElement();解析到标签的开头 <book>
endElement(); 解析到标签结尾</book>
character(); 解析到标签中间的文本
代码:
public classMyBookHandler extends DefaultHandler
{/* 声明解析后存储对象的集合*/
private Book book;
private List<Book>books;
private String tagName;//当前解析的标签
public list<Book> getBooks(){
return books;
}
public void startDocument() throws SAXException{
System.out.println("文档的开始");
}
public void endDocument()throws SAXException{
System.out.println("文档的结束");
}
/*解析到标签的开头String qName 解析到的标签的名称<book id="1001">
Attributes attributes 当前这个标签中的属性 id="1001" */
public void startElement (String uri,String localName,String qName,Attributes attributes) throws SAXException{
if("books".equals(qName)){
books=new ArrayList<>();
}else if("book".equals(qName)){
book=new Book();
String ids=attributes.getValue("id");
String date=attributes.getValue("publishdate");
book.setId(Integer.parseInt(ids));
book.setPublishdate(date);
}
tagName=qName;
}
/*解析到标签的结尾
@param uri
@param localName
@param qName
@throws SAXEXception */
public void endElement(String uri,String locatiion,String qName)throws SAXException{
//Sysem.out.println(“标签的结尾”+qName);
tagName=" ";
if("book"equals (qName))
{
book.add(book);
}
/*** 解析到文本
* @param ch * @param start * @param length * @throws SAXException */public void characters(char[] ch, int start, int length) throws SAXException {
// 把char类型的数组--->string String content = new String(ch,start,length); //System.out.println(content);//有可能得到换行符或者空格 content = content.trim(); //System.out.println("处理后:"+content+"---标签"+tagName); //book.setName(content); if ("name".equals(tagName)) {//"" book.setName(content); }else if("author".equals(tagName)) { book.setAuthor(content); }else if("price".equals(tagName)) { //book.setPrice(Double.parseDouble(content)); }}
使用SAX进行解析
伪代码:
具体代码:
dom解析:xml文件加载到内存中,在内存中构建树形结构,文件比较大,不建议使用DOM解析
核心API:
DocumentBuilderFactory
DocumentBuilder
Document xml文档
Node xml文件中的一个节点(标签节点,属性节点,空格或者注释等也是Node对象)
getNodeName(); 标签名称
getNodeValue(); 属性值
getAttributes() ; 得到属性列表
getTextContent();标签中的文本
NodeList: 子节点列表
Attribute 属性对象