一:xml是什么?
可扩展的标记语言
所有的xml都是有由前导区和数据区两部分组成
前导区:规定xml的一些属性:version:表示xml的版本
encoding:页面中使用的文字编码
standalone:次xml是否是独立运行
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
数据区:必须有一个根元素,一个根元素下可以存放多个子元素,每一个标签必须闭合,区分大小写
xml能干什么?
描述,存储,交换数据
xml与html的区别?
xml是用来描述数据,标签必须成对出现
html是用来显示数据,标签可以不成对出现
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- xml头标签:
version:版本号
encoding:字符集
standalone:表示是否是独立存在的xml文档:yes代表当前xml文件依赖于自己的dtd约束或者schream约束,为no代表依赖于外部的约束
标签:<标签名 属性名="属性值" 属性名="属性值"....>子标签或者文本</标签名>
<标签名 属性名="属性值"/> 省略结束标签
根标签:1.是所有其他标签的父标签2.一个xml文件有且只有一个根标签
-->
<!DOCTYPE threeking[
<!-- 定义元素 -->
<!ELEMENT threeking (country+)>
<!ELEMENT country (hero+)>
<!ELEMENT hero (#PCDATA)>
<!-- 定义属性 -->
<!ATTLIST country name CDATA "无名小国">
<!ATTLIST hero name CDATA "无名小将">
<!ATTLIST hero weapon CDATA "新兵矛">
]>
<!-- 导入外部dtd约束 -->
<!-- <!DOCTYPE threeking SYSTEM "king.dtd"> -->
<!-- 根节点 -->
/*1、编写一个xml文件把如下数据进行描述
【用户信息】
名字 工作 年龄
刘德华 演戏 20
科比 演戏 25
任良飞 炒股 18
*/
<Threeking>
<!-- 子节点 -->
<country worker="员工">
<hero name="刘德华" work="演戏" age="20"> </hero>
<hero name="科比" work="演戏" age="25"> </hero>
<hero name="任良飞" work="炒股" age="18"> </hero>
</country>
<Threeking>
二:xml解析: 先由xml分析器对xml进行分析,应用程序通过调用分析器提供的dom接口或者sax接口从而间接的实现了对xml 的 访问
1:dom解析:document object model;读取xml内容,然后生成文档树
优点:内存中生成了文档树,所以可以方便的文档的任意节点进行操作
缺点:内存中中生成了文档树,需要消耗的内存较大
步骤:(1)建立DocumentBuilderFactory工厂:DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
(2)建立DocumentBuilder解析器:DocumentBuilder builder = factory.newDocumentBuilder();
(3)建立Document对象:Document doc= builder.parse("要读取的文件路径");
(4)建立NodeList:NodeList nl = doc.getElementsByTagName("读取节点");
(5)进行XML信息读取。
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class Test1Dom {
public static void main(String[] args) {
test1();
}
//测试dom解析xml文档
private static void test1() {
//(1)建立DocumentBuilderFactory工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//定义解析器
DocumentBuilder builder = null;
Document document = null;
try {
//2、通过解析器工厂生产解析器
builder = factory.newDocumentBuilder();
//3、解析xml文档,得到document对象
document = builder.parse(new File("src/com/cdsxt/day21/XML/ThreeKing.xml"));
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//4、获取指定的结点集合
NodeList nodes = document.getElementsByTagName("hero");
//遍历集合取出结点
for(int i=0;i<=nodes.getLength()-1;i++) {
//根据下标来获取结点
Node node = nodes.item(i);
//将结点转化为元素结点
Element element = (Element)node;
//获取元素结点的相关属性
String name = element.getAttribute("name");//获取name属性
//获取weapon属性
String weapon = element.getAttribute("weapon");
//获取中间的文本内容
String title = element.getTextContent();
System.out.println("姓名:"+name+",使用的武器:"+weapon+",名号:"+title);
}
}
}
2:sax解析:simple api for xml;流式解析;一边读取,一边解析;解析的过程中并不保存具体的文件内容
优点:边读边取,对内存消耗较小
缺点:没有保存文档,不能随机访问节点
package com.cdsxt.day21.XML;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class Test2SAX {
/*
* 如果在开发中想要使用SAX解析,则首先应该编写一个SAX解析器:定义一个类,并使该类继承自DefaultHandler类,同时重写上述的表中的方法即可。
建立完SAX解析器后,还需要建立SAXParserFactory和SAXParser对象,之后通过SAXPaeser的parse()方法指定要解析的XML文件和指定的SAX解析器。
*/
public static void main(String[] args) {
test1();
}
//测试sax解析
private static void test1() {
//1、获取sax解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//2、获取sax解析器
SAXParser parser = null;
//创建MyHandler对象
Myhandler mh = new Myhandler();
try {
parser = factory.newSAXParser();
//3、解析xml文档
parser.parse(new File("src/com/cdsxt/day21/XML/ThreeKing.xml"), mh);
} catch (ParserConfigurationException | SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//获取读取的内容
List<Hero> list = mh.list;
//System.out.println(list);
for (Hero hero : list) {
System.out.println("三国名将:"+hero.name+",使用的武器:"+hero.weapon);
}
}
}
//定义一个类,并使该类继承自DefaultHandler类
class Myhandler extends DefaultHandler{
//定义一个list集合
List<Hero> list = new ArrayList<Hero>();
//定义Hero属性
Hero hero;
//读取到元素结点开始时所触发的事件
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//qName:表示读取到的元素结点的标签名
//attributes:表示读取到的元素的属性
//只需要处理元素结点为hero的结点
if("hero".equals(qName)) {
//获取该结点的属性
String name = attributes.getValue("name");
String weapon = attributes.getValue("weapon");
hero = new Hero(name, weapon);
//放入list集合
list.add(hero);
}
}
//读取到文本结点时所触发的事件
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
//设置title属性
if(hero!=null) {
//将字符数组转换为字符串
String title = new String(ch, start, length);
//去除空白
title = title.trim();
hero.title = title;
//将hero重置为null
hero = null;
}
}
}
//定义Hero类
class Hero{
String name;
String weapon;
String title;
public Hero(String name, String weapon, String title) {
super();
this.name = name;
this.weapon = weapon;
this.title = title;
}
public Hero(String name, String weapon) {
super();
this.name = name;
this.weapon = weapon;
}
public Hero() {
super();
}
@Override
public String toString() {
return "Hero [name=" + name + ", weapon=" + weapon + ", title=" + title + "]";
}
}
三:第三方工具
jdom:结合了dom修改文件的优点和sax快速读取的优点
dom4j:spring框架中使用dom4j进行xml解析
package com.cdsxt.day21.XML;
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
public class Test3JDom {
public static void main(String[] args) {
test1();
}
//测试jdom解析xml文档
private static void test1() {
//1、jdom是一个第三方工具,使用时需要先导入其jar包。
//2、创建解析器(其实是sax2的)
SAXBuilder builder = new SAXBuilder();
//3、解析xml文档
Document document = null;
try {
document = builder.build(new File("src/com/cdsxt/day21/XML/ThreeKing.xml"));
} catch (JDOMException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//获取结点:获取根节点
Element root = document.getRootElement();
//获取所有子节点
List<Element> childs = root.getChildren();
//遍历子节点
for (Element child : childs) {
//element:表示的是country结点
//获取国家的名字
String country = child.getAttributeValue("name");
//获取当前country下的子节点
List<Element> heros = child.getChildren();
for (Element hero : heros) {
//获取hero的属性
String name = hero.getAttributeValue("name");
String weapon = hero.getAttributeValue("weapon");
//获取文本值
String title = hero.getText();
//打印结果
System.out.println("三国演义:"+country+";猛将:"+name+",使用的武器:"+weapon+";绰号:"+title);
}
}
}
}