XML全称为Extensible Markup Language,意思是可扩展的标记语言<a></a>。
XML文档声明格式:
<?xml version="1.0" encoding="UTF-8"?>
- 文档声明必须为<?xml开头,以?>结束;
- 文档声明必须从文档的0行0列位置开始;
- 文档声明只有2个属性:
- versioin:指定XML文档版本。必须属性,一般选择1.0;
- encoding:指定当前文档的编码。可选属性,默认值是utf-8
XML文档元素<bean>元素体</bean>
- 元素是XML文档中最重要的组成部分,
- 普通元素的结构开始标签、元素体、结束标签组成。例如:<hello>大家好</hello>
- 元素体:元素体可以是元素,也可以是文本,例如:<b><a>你好</a></b>
- 空元素:空元素只有开始标签,而没有结束标签,但元素必须自己闭合,例如:<c/>;<c attr=”ceshi” />
- 元素命名:
- 区分大小写
- 不能使用空格,不能使用冒号:
- 不建议以XML、xml、Xml开头
- 格式化良好的XML文档,必须只有一个根元素。
XML文档<bean> 对象的属性
<bean id=”” className=””>
- 属性是元素的一部分,它必须出现在元素的开始标签中
- 属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引
- 一个元素可以有0~N个属性,但一个元素中不能出现同名属性
- 属性名不能使用空格、冒号等特殊字符,且必须以字母开头
XML文档的注释
XML的注释,以“<!--”开始,以“-->”结束
XML文档的约束
DTD(常用的有struts2、hibernate)、Schema(常用的有spring)
XML文档的简析方式
- DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象。XML树
- 优点:解析过程中,树结构保存在内存中,元素与元素之间保留结构关系,方便修改,故可以进行增删改查操作。
- 缺点:XML文档过大,容易影响解析性能且可能会造成内存溢出。
- SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。
- 优点:处理速度快,可以处理大文件
- 缺点:只能读,逐行后将释放资源。
PULL:Android内置的XML解析方式,类似SAX。(了解,没见过)
常用的解析包(dom4j是必备技能)
-
- JAXP:sun公司提供支持DOM和SAX开发包
- JDom:dom4j兄弟
- jsoup:一种处理HTML特定解析开发包
- dom4j:比较常用的解析开发包,hibernate底层采用。
DOM4j的使用
- 如需要使用dom4j,必须导入jar包,dom4j-**.jar
- 使用核心类SaxReader加载xml文档获取Document对象
- 常用的API方法
- SaxReader对象
- read(…) 加载执行xml文档
- Document对象
- getRootElement() 获得根元素
- Element对象
- elements(…) 获得指定名称的所有子元素。可以不指定名称
- element(…) 获得指定名称第一个子元素。可以不指定名称
- getName() 获得当前元素的元素名
- getStringName()获得当前元素的值
- attributeValue(…) 获得指定属性名的属性值
- elementText(…) 获得指定名称子元素的文本值
- getText() 获得当前元素的文本内容
- SaxReader对象
代码样例
public static void main(String[] args) {
//创建SAXReader对象
SAXReader saxReader = new SAXReader();
try {
//使用read方法读取test.xml,生成document对象,try_catch异常
Document doc = saxReader.read(new File(("src/res/test.xml")));
//获取根元素
Element rootElement = doc.getRootElement();
//获取根元素下面的所有子元素
List<Element> list = rootElement.elements();
//循环遍历子元素
for(Element element : list){
String id =element.attributeValue("id");
String className = element.attributeValue("className");
System.out.println(id+""+className);
//获取子元素下面的子元素指定属性的属性值
List<Element>listElem = element.elements();
for(Element elem : listElem){
String name = elem.attributeValue("name");
String value = elem.attributeValue("value");
System.out.println(name+""+value);
}
//获取xml元素的名称和元素值
Iterator<Element> iterator = element.elementIterator();
while (iterator.hasNext()) {
Element elem = iterator.next();
String name = elem.getName();
String stringValue = elem.getStringValue();
System.out.println("节点名:" + name + "--节点值:" + stringValue);
}
}
} catch (DocumentException e) {
e.printStackTrace();
}