表现:以.xml为文件扩展名的文件
存储:树形结构
每个节点需要一个开始标签<标签名>和结束标签</标签名>。
节点名称区分大小写。
节点的属性
1、可以写在节点名称标签开始的后半部分<标签名 属性="属性值">。
2、可以作为节点的值写在两个标签中间。<标签名>节点值</标签名>。(节点值不用双引号)
可以不断拓展子节点来描述父节点包含的内容。
xml在写正文前,要加一个声明:<?xml version="1.0" encoding="UTF-8"?>声明版本与编码。
xml用于存储集成信息,能用相同的xml文件将不同的东西联系起来。
获取xml文件内容的
四种解析方式:DOM SAX DOM4J JDOM
DOM、SAX :java 官方方式,不需要下载jar包
DOM4J、JDOM :第三方,需要网上下载jar包
DOM使用步骤:
准备工作
1、创建一个DocumentBuilderFactory的对象
DocumentBuilderFactory dbf = DocumnetBuilderFactory.instance();
2、创建一个DocumentBuilder的对象
DocumentBuilder db = dbf.newDocumentBuilder();
3、通过DocumentBuilder对象的parse方法加载xml文件到当前项目
Document document = db.parse("*.xml");
DOM下解析xml文件节点的属性:
org-w3c-dom
一、未知节点属性的个数和属性名时:
1、Document类的.getElementsByTagName(标签名)方法,可通过标签名返回节点的集合(返回NodeList类型)
(对于NodeList,得到的是具有相同标签名的节点的集合List,需要用for遍历。)
2、NodeList类的.getLength() 可返回集合的长度。
3、NodeList类的.item(int index) 可访问集合中下标为index的节点(index从0开始),(返回Node类型)。
4、Node类的.getAttributes() 返回节点Node的所有属性的集合(返回NamedNodeMap类型)。
5、NamedNodeMap类的.getLength() 可返回节点具有的属性的数目。
6、NamedNodeMap类的.item(int index) 可获取节点下索引值为index的属性,返回Node类型。
7、NamedNodeMap类的.getNodeName()可返回该属性的名称,通过.getNodeValue()返回属性值。
二、已知节点的属性只有一个,且属性名已知
1、Document类的.getElementsByTagName(标签名)方法,可通过标签名返回节点的集合(返回NodeList类型)
2、NodeList类的.getLength() 可返回集合的长度。
3、NodeList类的.item(int index)强制类型转换为Element类型。
4、Element类的.getAttribute(属性名) 可得到属性的值。(返回String类型)
解析文件节点以及子节点的值
1.先获取子节点,Node下有方法getChildNodes()来获取某个节点的子节点的集合,返回NodeList类型.
NodeList childNodes=book.getChildNodes()//包含book节点所有的子节点,两个标签之间的所有内容都看成是子节点.
2.通过childNodes的getLength()方法返回字点的个数(空格与换行字符看成为一个文本节点,标签与结束标签看成一个元素节点)
3.通过NodeList的item(i)获取指定位置子节点的名称返回Node类型.再用Node类型的getNodeName()方法就可以获取节点名
Node childnode=childNodes.item(i);
String name=childnode.getNodeName();
可以通过Node类的getNodeType()来区分文本类型的node以及元素类型的node,看当前Node类型是否与Node."节点类型英
文全称"相同.
if(childnode.getNodeType==Node.ELEMENT_NODE)
{System.out.println(name)}
4.不能直接通过Node的getNodeValue()来获取节点的值,因为元素节点的nodeValue的返回值为null而且标签之间的文本被看
做是该标签的子节点.所以要用Node的getFirstChild()此时获取的子节点为文本节点,Text节点类型的nodeValue返回值为节
点内容,再getNodeValue()。
或者直接用Node的getTextContent()方法直接获取节点值。
如果该Node节点还存在其他子节点并且有节点值<name><a>广州大学</a>华软学院</name>,那么用
getFirstChild().getNodeValue()一样是null,因为获取的子节点仍然是element类型的
如果用Node的getTextContent(),一样会把<a>元素节点当成是Content输出。 结果为广州大学华软学院.
基础方法:DOM(平台无关的官方解析方式)、SAX(基于事件驱动的解析方式)
扩展方法:JDOM、DOM4J(在基础的方法上扩展出的,只有在java中能够使用的解析方法)
DOM:一次性将整个xml文件加载到内存中,形成DOM树
优点:形成了树结构,直观好理解,代码更容易编写
解析过程中树结构保留在内存中,方便修改
缺点:当xml文件较大时,对内存消耗比较大,容易影响解析性能并造成内存溢出
SAX:逐条语句判断解析
优点:采用事件驱动模式,对内存消耗比较小
适用于只需要处理xml中数据时
缺点:不易编码
很难同时访问同一个xml中的多处不同数据
JDOM:仅使用具体类而不使用接口
API大量使用了Collections类
DOM4J:JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能
DOM4J使用接口和抽象基本类方法,是一个优秀的Java XML API
具有性能优异、灵活性好、功能强大和极端易使用的特点
是一个开放源代码的软件
JUnit是Java提供的一种进行单元测试的自动化工具。测试方法可以写在任意类中的任意位置。使用JUnit可以没有main()入口进行测试。
DOM4J在灵活性和对复杂xml的支持上都要强于DOM
DOM4J的应用范围非常的广,例如在三大框架的Hibernate中是使用DOM4J的方式解析文件的。
DOM是w3c组织提供的一个官方解析方式,在一定程度上是有所应用的。
当XML文件比较大的时候,会发现DOM4J比较好用
1.JUnit:Java提供的单元测试;@Test注解;采用JUnit不需要程序入口main方法
2.性能测试结果:几kB的xml文件;建议使用DOM4J解析
DOM-33ms
SAX-6ms
JDOM-69ms
DOM4J-45ms
工程右键build path --Add library--JUnit单元测试 --version:JUnit4
DOM:33,SAX:6
JDOM:69;DOM4J:45
DOM 有可能溢出
多使用DOM4J