xml&Tomcathtml
1. 保存数据 2. 配置文件 3. 数据传输载体
定义:就是一个文件,后缀为.xmljava
- 简单声明,version:解析这个xml的时候,使用什么版本的解析器解析 <?xml version="1.0" ?> - encording:解析xml中的文字的时候,使用什么解码来翻译 <?xml version="1.0" encording="gbk" ?> - standalone:no - 该文档会依赖关联其余文档,yes - 这是一个独立的文档 <?xml version="1.0" encording="gbk" standalone="no" ?>
标签能够自定义 xml元素必须遵循如下命名规则: 名称能够含字母、数字以及其余的字符 名称不能以数字或者标点符号开始 名称不能以字符“xml”(或者XML、Xml)开始 名称不能包含空格 命名进尽可能简单,见名知意
简单元素:元素里面包含了普通的文字面试
复杂元素:元素里面还能够嵌套其余的元素服务器
定义在元素里面,<元素名称 属性名称="属性的值"></元素名称>dom
与html的注释同样,可是xml的注释不容许放在文档的第一行,必须在文档声明的下面ui
<?xml version="1.0" encoding="UTF-8"?> <!-- 这里有两个学生,一个叫张三一个叫李四 --> <stus> <stu id="10086"> <name>张三</name> <age>24</age> </stu> <stu d="10086"> <name>李四</name> <age>23</age> </stu> </stus>
严格的讲,在xml中仅有字符"<"和"&"非法的。省略号、引号和大于号都是合法的,能够把他们替换成实体引用翻译
< < & &
若是某段字符串里面有过多的字符,而且里面包含了相似标签或者关键字的这种文字,不想让xml的解析器去解析,那么可使用CDATA来包装,不过这个CDATA通常比较少看到,一般在服务器给客户段返回数据的时候code
<des><!CDATA[<a=href="http://www.baidu.com">百度搜索</a>]]></des>
获取元素里面的字符数据或者属性数据xml
解析方式(面试常问,有不少种经常使用种,经常使用两种)htm
DOM:document object model把整个xml所有读到内存当中,造成树状结构。整个文档称之为document对象,属性对应Attribute对象,全部的元素节点对应Element对象,文本特能够称之为Text对象,以上全部对象均可以称之为Node节点。若是xml特别大,那么将会形成内存溢出。能够对文档进行增删操做
SAX:Simple API for Xml 基于时间驱动。读取一行,解析一行,不会形成内存溢出,不能够进行增删,只能查询
针对以上两种解析方式的API,一些组织或者公司给出的解决方案:
jax sun公司 比较繁琐 jdom dom4j 使用比较普遍
导入dom4j的jar包放在文件夹lib中buil path---add to buildpath
注意这里若是项目前面红色感叹号的问题多是导入多余的jar包,右键工程到configure到library删除添加的jar,并把导错的压缩文件删掉,从新导入
element.element("stu"):返回该元素下的第一个元素
element.elements:返回该元素下的全部
1. 建立SaxReader对象 2. 指定解析的xml 3. 获取根元素 4. 根据根元素获取子元素或者下面的子孙元素 import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class MainTest { public static void main(String[] args) { try { //1.建立sax读取对象 SAXReader reader=new SAXReader(); //2.指定解析的xml源 Document ducument = reader.read("src/xml/stus.xml"); //3.获得根元素 Element rootElement = ducument.getRootElement(); /*4.获得根元素下面的子元素,根据stu标签名获得根元素stus下面第一个stu元素, * 再经过stu得到下面age元素中的文本*/ System.out.println(rootElement.element("stu").element("age").getText()); //获得根元素下面的全部子元素,但不包括孙元素 List<Element> elements = rootElement.elements(); //再根据子元素得到下面的孙元素 for (Element element:elements) { String name = element.element("name").getText(); String age = element.element("age").getText(); System.out.println("name="+name+" age="+age); } } catch (Exception e) { e.printStackTrace(); } } }
xpath是xml的路径语言,支持在解析xml的时候,可以快速定位到具体的某一个元素
导入jar包放在文件夹lib中buil path---add to buildpath
2.在查找指定节点的时候,根据XPath语法规则来查找(参考ZVON.org - XPath Tutorial中文手册)
路径以斜线 / 开始, 那么该路径就表示到一个元素的绝对路径;/AAA 选择根元素AAA ;/AAA/CCC 选择AAA的全部CCC子元素
路径以双斜线 // 开头, 则表示选择文档中全部知足双斜线//以后规则的元素(不管层级关系);//BBB 选择全部BBB元素 ;//DDD/BBB 选择全部父元素是DDD的BBB元素
3.后续的解析代码同样
import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class XPathTest { public static void main(String[] args) { try { //1.建立sax读取对象 SAXReader reader=new SAXReader(); //2.指定解析的xml源 Document ducument = reader.read("src/xml/stus.xml"); //3.获得根元素 Element rootElement = ducument.getRootElement(); //若想使用XPath,须要先添加jar包 ,获取第一个,只返回一个name Element nameElement =(Element)rootElement.selectSingleNode("//name"); System.out.println(nameElement.getStringValue()); //不论层级得到全部的age元素的集合 List<Element> list = rootElement.selectNodes("//age"); for (Element element : list) { System.out.println(element.getText()); } } catch (Exception e) { e.printStackTrace(); } } }