XML
xml是可扩展标记语言,是独立于软件和硬件的信息传输工具
xml应用于web开发的而许多方面,用于简化数据的存储和共享(代替xml的是json)
xml简化数据共享,简化数据传输,简化平台的变更。
在java程序中,xml可以作为应用程序的配置文件,存储应用程序的配置信息,应用案例比如:Spring框架中的application.xml,Mybits框架中的映射配置文件
初识XML
xml其实也是由标签组成的
xml处理执行,简称PI,处理指令用来指挥解析引擎处理xml
xml中对于大小写敏感
xml的第一种书写方式(DTD)
xml的文档声明必须处在第一行的位置 ```xml
standalone属性标示当前xml文档是不是独立文档,属性值以及其含义如下:
yes 表示当前xml文档是独立文档,文档定义直接包含在当前xml文档中
no 表示当xml文档不是独立文档,可以引用外部的文档定义文件
文档声明可以省略。省略后,则文档的元素可以自定义。
如果声明文档规则,则文件中只能使用规则只能的格式进行内容编写
方式一: standalone属性为 yes ,即在当前文档内指定规则
语法:
]>
例如:
]>
属性的类型:
ID 表示唯一
(值1|值2)‘值1’ 二选一,有默认值
CDATA 文本类型
IDREF 依赖 引用已经出现过的类型
属性描述:
#REQUIRED 必填
#IMPLIED 非必填
方式二:: standalone属性为 no ,即引入外部的规则文件
引入外部DTD文件的语法:
例如:
DTD文件中定义元素规则
```
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 方式解析
```java // 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 elementList=root.elements(); // elementList.stream().forEach(element -> System.out.println(element.getName())); // //删除子元素 // Element child ele=root.element("student"); // root.remove(childele); // //获取子节点的所有属性 // List elementList2=root.elements(); // elementList2.stream().forEach(element -> { // //获取当前元素的属性个数 // int count=element.attributeCount(); // }); Element child=root.element("child"); List list= child.attributes(); //获取属性集合 list.stream().forEach(attribute -> { //获取属性名称 属性值 System.out.println(attribute.getName()+attribute.getValue()); if(attribute.getValue().equals("1")){ //删除属性 child.remove(attribute); } }); } }
```