XML概念:
XML 是指可扩展标记语言,类似于HTML,设计的宗旨是传输数据。
XML 技术是W3C(World Wide Web Consorttium)组织发布的,目前遵循的是W3C组织在2000年发布的XML1.规范。
XML 常见应用
1 保存有关系的数据
2 软件的配置文件
3 Struts2 Spring Hibernate都是使用XML作为配置文件
XML语法
文档声明
<?xml version=“1.0” standalone=“yes” encoding=“UTF-8”?> xml版本 是否独立(是否依赖其他文档) 编码方式
元素
有且仅有一个根标签 包含标签主体 <city>北京</city> 不包含标签主体 <city id="1"/> 区分大小写 <P>和<p>是两个不同的标记。 不能以数字或“-” (中划线)开头 不能以xml(或XML、或Xml 等)开头。 不能包含空格。 名称中间不能包含冒号(:)
属性
<city name="北京" citydes="北京是帝都"></city>
注释
<!--这是注释-->
特殊字符 –转义
& & < < > > " " ' '
CDATA区
作用:使用CDATA区中间的内容解析成文本内容(字符串)。 语法: <![CDATA[内容]]>
XML规则总结
所有 XML 元素都须有关闭标签</>
XML 标签对大小写敏感
XML 必须正确地嵌套顺序
XML 文档必须有根元素(只有一个)
XML 的属性值须加引号 ""
特殊字符必须转义 --- CDATA
XML 中的空格、回车换行会解析时被保留
XML解析
Dom解析
加载XML的文件,形成树状结构。 优点:树状结构,非常方便做增删改的操作。 缺点: 必须先加载xml的文档,全部加载,如果文档过大的话,容易导致OOM Out of Memory(内存溢出)。
SAX解析
基于事件驱动的解析方式,边读边解析 优点:边读边解析,不会产生内存溢出的问题 缺点:不能够做增删改的操作。
Dom4J
解析 XML
public static void readXml() { //定义SAX阅读器 SAXReader saxReader = new SAXReader(); try { //读取要解析的文件 Document document = saxReader.read("data.xml"); //获取根节点 Element rootElement = document.getRootElement(); //获取要解析的节点 List<Element> elements = rootElement.elements("person"); //开始进行解析 for (Element element : elements) { //获取属性值 String id = element.attribute("id").getText(); String name = element.element("name").getText(); String age = element.element("age").getText(); System.out.println(id + "---" + name + "==" + age); } } catch (DocumentException e) { e.printStackTrace(); } } /** * 添加节点 */ private static void addXml() { //定义解析器 SAXReader saxReader = new SAXReader(); try { //读取xml文件 Document document = saxReader.read("data.xml"); //获取根节点信息 Element rootElement = document.getRootElement(); //获取根节点中的子节点 List<Element> elements = rootElement.elements("person"); //遍历节点,获取sex节点,修改sex节点的内容信息 for (Element element : elements) { Element addElement = element.addElement("sex"); addElement.setText("mail"); } //设置回写的格式为漂亮格式 OutputFormat createPrettyPrint = OutputFormat.createPrettyPrint(); //回写,将会修改到xml的内容 XMLWriter xmlWriter = new XMLWriter( new FileOutputStream("data.xml"), createPrettyPrint); xmlWriter.write(document); xmlWriter.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 删除节点 */ private static void deleteXmlNode() { SAXReader saxReader = new SAXReader(); try { Document document = saxReader.read("data.xml"); Element rootElement = document.getRootElement(); List<Element> elements = rootElement.elements("person"); for (Element element : elements) { Element element2 = element.element("name"); //通过父节点,移除子节点 element.remove(element2); } OutputFormat createPrettyPrint = OutputFormat.createPrettyPrint(); XMLWriter xmlWriter = new XMLWriter( new FileOutputStream("data.xml"), createPrettyPrint); xmlWriter.write(document); xmlWriter.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 修改节点信息 */ private static void updateXmlNode() { // TODO Auto-generated method stub SAXReader saxReader = new SAXReader(); try { Document document = saxReader.read("data.xml"); Element rootElement = document.getRootElement(); List<Element> elements = rootElement.elements("person"); for (Element element : elements) { Element element2 = element.element("age"); element2.setName("ddd"); } OutputFormat createPrettyPrint = OutputFormat.createPrettyPrint(); XMLWriter xmlWriter = new XMLWriter( new FileOutputStream("data.xml"), createPrettyPrint); xmlWriter.write(document); xmlWriter.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
创建xml文档
try { // 创建xml文档 Document document = DocumentHelper.createDocument(); // 创建根节点 Element rootElement = document.addElement("users"); for (User user : userList) { // 每一个用户创建一个user节点 Element userElement = rootElement.addElement("user"); Element nameElement = userElement.addElement("name"); Element sexElement = userElement.addElement("sex"); Element departElement = userElement .addElement("department_name"); nameElement.setText(user.getName()); sexElement.setText(user.getSex()); departElement.setText(user.getDepartment_name()); } // 输出文档 // 获取当前时间的毫秒值 1970 + System.currentTimeMillis() XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(new File( "user.xml")), OutputFormat.createPrettyPrint()); xmlWriter.write(document); xmlWriter.close(); } catch (Exception e) { e.printStackTrace(); }
对象XPATH XML快速查找
/persons/person/name //name @Test public void xPath() { // 创建解析器对象 try { SAXReader reader = new SAXReader(); //读取文件 Document document = reader.read(new File("data.xml")); //根据节点顺序查询子节点 List<Node> nodes = document.selectNodes("/persons/person/name"); for (Node node : nodes) { System.out.println(node.getText()); } //直接查询某个节点 List<Element> elements = document.selectNodes("//age"); for (Element element : elements) { System.out.println(element.getText()); } } catch (DocumentException e) { e.printStackTrace(); } }
约束
为什么要约束:
XML都是用户自定义的标签,若出现小小的错误,软件程序将不能正确地获取文件中的内容而报错。(如:Tomcat) XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为约束。
常用的约束技术
XML DTD XML Schema
DTD 约束
Struts2 --dtd 关联dtd (Document Type Definition),全称为文档类型定义。 DTD约束即可以作为一个单独的文件编写,也可以在XML文件内编写 使用内部DTD <!DOCTYPE 根节点 [ DTD的代码 ]> 使用外部DTD <!DOCTYPE 根节点 SYSTEM “DTD的地址” > 使用网络DTD <!DOCTYPE 根节点 PUBLIC “DTD的名称” “DTD的地址” > 语法结构
元素定义
* 写法:<!ELEMENT 元素名称 元素类型>
* 元素类型:
* (#PCDATA) 可解析的字符数据(字符串)
* EMPTY 空(没有标签主体)
* ANY 任意类型
* (子节点1,子节点2...) 当前的元素是复杂的元素,下面包含子节点
* 子节点之间关系
* 子节点与子节点出现顺序的关系
* , :代表子节点按着顺序出现
* | :子节点出现只能出现一个
* 子节点出现的数量的关系
* + :子节点可以出现1次或多次
* * :子节点可以出现0次或多次(任意次)
* ? :子节点可以出现0次或1次
属性定义
* 写法:
<!ATTLIST 元素名称
属性名称 属性类型 属性约束
属性名称 属性类型 属性约束
>
* 属性类型
* CDATA 字符数据(字符串)
* 枚举:没有关键字,写法(值1|值2|值3),只能从枚举中选择其中一个值
* ID:代表是属性是唯一的,值就不能相同了。值也不能是数字
* 属性约束
* #REQUIRED 属性是必须要出现的
* #IMPLIED 属性的出现是可选的
* #FIXED 固定值 -- #FIXED "固定值"
* 默认值 提供默认值 ""
Schema约束
XML Schema 也是一种用于定义和描述 XML 文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性 XML Schema符合XML语法结构。 DOM、SAX等XML API很容易解析出XML Schema文档中的内容。 XML Schema比XML DTD支持更多的数据类型,并支持用户自定义新的数据类型。 XML Schema不能像DTD一样定义实体,比DTD更复杂,但Xml Schema现在已是w3c组织的标准,它正逐步取代DTD。