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);
}
});
}
}