java与XML

149 阅读3分钟

XML

xml是可扩展标记语言,是独立于软件和硬件的信息传输工具

xml应用于web开发的而许多方面,用于简化数据的存储和共享(代替xml的是json)

xml简化数据共享,简化数据传输,简化平台的变更。

在java程序中,xml可以作为应用程序的配置文件,存储应用程序的配置信息,应用案例比如:Spring框架中的application.xml,Mybits框架中的映射配置文件

初识XML

xml其实也是由标签组成的

xml处理执行,简称PI,处理指令用来指挥解析引擎处理xml

xml中对于大小写敏感

xml的第一种书写方式(DTD)

xml的文档声明必须处在第一行的位置

<?xml version="1.0" encodeing="UtF-8" />
<!-- version是版本号 , encodeing 是字符编码-->

​	standalone属性标示当前xml文档是不是独立文档,属性值以及其含义如下:

​		yes 表示当前xml文档是独立文档,文档定义直接包含在当前xml文档中

​		no 表示当xml文档不是独立文档,可以引用外部的文档定义文件



​	文档声明可以省略。省略后,则文档的元素可以自定义。

​	如果声明文档规则,则文件中只能使用规则只能的格式进行内容编写

​		方式一: standalone属性为 yes ,即在当前文档内指定规则

​			语法:

​			<!DOCTYPE 根元素[
​      	  <!ELEMENT 根元素 (子元素1,子元素2,子元素3)>
​       			<!ELEMENT 子元素1 (#PCDATA)>
​      			<!ELEMENT 子元素2 (#PCDATA)>
​       			<!ELEMENT 子元素3 (#PCDATA)>

​			<!ATTLIST 子元素名
   	    属性名 值的类型 类型描述
   	   >	

​       			 ]>

​			例如:

​			<!DOCTYPE students[
​          <!ELEMENT students (name,age,sex,address)>
​        		<!ELEMENT name (#PCDATA)>
​        		<!ELEMENT age (#PCDATA)>
​        		<!ELEMENT sex (#PCDATA)>

​			<!ELEMENT address (#PCDATA)>

​			<!ATTLIST address
   	    country  CDATA #REQUIRED 
   	   >	

​       	 		]>		

​			属性的类型:

​				ID  表示唯一

​				(值1|值2)‘值1’  二选一,有默认值

​				CDATA 文本类型

​				IDREF 依赖  引用已经出现过的类型

​			属性描述:

​				#REQUIRED 必填

​				#IMPLIED  非必填

​		方式二:: standalone属性为 no ,即引入外部的规则文件

​			引入外部DTD文件的语法:

​			<!DOCTYPE 根元素 SYSTEM "文件路径">

​			例如:

​			<!DOCTYPE students SYSTEM "user.dtd">		

​			DTD文件中定义元素规则

​			<!ELEMENT 根元素 (子元素1,子元素2,子元素3)>
​       			<!ELEMENT 子元素1 (#PCDATA)>
​      			<!ELEMENT 子元素2 (#PCDATA)>
​       			<!ELEMENT 子元素3 (#PCDATA)>	

​			<!ATTLIST 子元素名
   	    属性名 值的类型 
   	   >

xml的第二种书写方式(STD)

java解析和写入xml

java对于xml解析的方式有两种分别是 DOM(占用内存大) 和SAX(占用内存小)基于事件驱动的流的形式

DOM和SAX的区别,DOM的方式可以理解为是浏览器读取HTML需要读取整个DOM树,而SAX采用的是顺序解析只关注当前元素。但是SAX是事件驱动的,触发事件时需要调用相对应的方法进行处理,这就需要为不同的xml写不同的方法,但是DOM是基于w3c的标准来的,有一套通用的标准对xml进行处理。 解析XML的库有JDOM , DOM4J,JAX-PP

 这里只展示DOM4J的用法,因为DOM4J是一个简单的灵活的,开源的库,早期是由于开发JDOM的人员开发后分离出来独立开发,DOM4J提供了比JDOM更好的灵活性。

DOM4j 方式解析

// DOM4J类
package com.yh.xml;

import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.FileWriter;
import java.io.IOException;


public class ReadWriteXml {
   private Element root;
   public void read() throws DocumentException {
       SAXReader saxReader=new SAXReader();
       /**
        * read方法返回的是Document对象
        * 可以通过document对象获取到根节点
        */
       Document document=saxReader.read("src/com/yh/xml/write.xml");
       this.root=document.getRootElement();
   }
   public void write() throws IOException {
       /**
        * 创建根节点方式1
        */

//             Document document= DocumentHelper.createDocument();//创建根节点
//             this.root=document.addElement("root")
       /**
        * 创建根节点方式2
        */
       Document doc= DocumentFactory.getInstance().createDocument();
       this.root=doc.addElement("root");
       //添加子节点
       root.addElement("child");
       Element child=root.element("child");
       //为当前节点添加属性
       child.addAttribute("value","1");
       child.addAttribute("id","2");
       //xml指定输出格式
       OutputFormat outputFormat= OutputFormat.createCompactFormat();
       XMLWriter writer=new XMLWriter(new FileWriter("src/com/yh/xml/write.xml"));
       writer.write(doc); //写入Document
       writer.flush();//刷新缓冲区
       writer.close();
   }

   public Element getRoot() {
       return root;
   }

   public void setRoot(Element root) {
       this.root = root;
   }
}
// test类
package com.yh.xml;

import org.dom4j.Attribute;
import org.dom4j.DocumentException;
import org.dom4j.Element;

import java.io.IOException;
import java.util.Iterator;
import java.util.List;

public class test {
   public static void main(String[] args) throws DocumentException, IOException {
       ReadWriteXml readWriteXml=new ReadWriteXml();
       //写入xml文件
       readWriteXml.write();
       //读取xml文件
       readWriteXml.read();
       //获取到根节点
       Element root=readWriteXml.getRoot();
//        //获取节点名称
//        System.out.println(root.getName());
//        //获取根节点的所有子节点
//        List<Element> elementList=root.elements();
//        elementList.stream().forEach(element -> System.out.println(element.getName()));
//         //删除子元素
//        Element child_ele=root.element("student");
//        root.remove(child_ele);
//        //获取子节点的所有属性
//        List<Element> elementList2=root.elements();
//        elementList2.stream().forEach(element -> {
//            //获取当前元素的属性个数
//            int count=element.attributeCount();
//        });
       Element child=root.element("child");
       List<Attribute> list= child.attributes();
       //获取属性集合
       list.stream().forEach(attribute -> {
           //获取属性名称 属性值
           System.out.println(attribute.getName()+attribute.getValue());
           if(attribute.getValue().equals("1")){
               //删除属性
               child.remove(attribute);
           }
       });
   }
}