本文共 5968 字,大约阅读时间需要 19 分钟。
是一种常用的数据结构,用于数据的共享
1) xml是文本文件,常用编码是 utf-8(方便国际化)
2) xml的第一行处理节点:
<?xml version="1.0" encoding="utf-8" ?>
注意:必须在第一行,前面不能有“注释”和空行!3) xml 注释:
<!-- 你的注释信息 -->
注意,不能写Java的注释!4) 标签(标记 tag), 标签有3种
开始标签(start tag):<标签名>
结束标签(end tag):</标签名>
单标签(自结束标签):<标签名/>
单标签是 <标签名></标签名> 的简写 <标签名/> 5) 内容:开始标签和结束标签之间的数据称为“内容”Content
内容:文本内容,子元素,子元素和文本的混合 6) 元素:开始标签+内容+结束标签 称为元素7 元素的属性:
7.1) 在开始标签上定义
7.2) 由属性名和属性值组成
7.3) 属性值必须添加 引号
7.4) 属性无序,不能重复。8) 良好的结构:XML 文档的结构“规定”:
8.1) XML 文档必须有“唯一”的根元素!
一个xml 只能有一个根元素!
xml文档,只有一个元素!其他元素都是根元素的内容
8.2) 所有标签必须配对使用!
开始标记和结束标记必须配对!
无内容的元素<标签名></标签名> 可以简写 <标签名/>
8.3) 标签可以嵌套,但是不能交叉嵌套:
合理嵌套:<book><name>冯唐</name></book>
不合理嵌套:<book><name>冯唐</book></name>
标签在嵌套时候,外层称为“父元素”,内层称为“子元素”
8.4) 大小写是敏感的。区分大小写
正确:<name>冯唐</name> <Name>冯唐</Name>
错误:<Name>冯唐</name>
8.5) 属性: 无序,属性值必须使用 引号 满足以上规则称为:格式良好的XML9) XML 的可扩展性:
9.1) XML没有规定标签名!标签名可以任意扩展!
9.2) 没有规定属性,XML元素的属性可以扩展!
9.3) 没有规定元素的嵌套关系,嵌套关系可以扩展。 XML 是可以任意扩展,标记(标签)语言。10) xml 的优点:
1) 可以任意扩展!可以描述任何数据。是通用的数据格式。干啥都行!
2) 严格的语法规定!可以用通用的API解析。
简化了编程。提高开发效率。11) 在xml的正文中出现特殊符号:< > & 等需要替换为 "实体(entity)" ,否则会出现语法混乱;
< 替换为 <
> 替换为 >
& 替换为 &
还有很多很多... 如 : 中 替换为 中 12) CDATA: 如果大量的出现特殊符号,可以直接使用CDATA书写,就不用进行替换了! 在XML文本中使用,处理特殊符号: 区别:如果文本中有少了的特殊符号:实体替换。 如果文本中有大量的特殊符号:CDATA书写1) XML是文件,读写必须使用 IO流!
使用基本流可以读写XML,但是非常麻烦!
所以有API,帮助读写XML,简化了XML的读写!2) DOM4j API 简化了XML文件的读写。
来自于开源社区。
DOM4j API 底层也是 字节IO流。3) DOM4j 的使用!
1) 导入DOM4j 的API jar文件
jar文件 = 一批class
2) 使用 SAXReader读取 XML文件4)DOM4j API 用途
1 - 读取XML为doc对象 2 - 获取XML数据 3 - 更新XML数据 4 - 写出XML文件5 - 创建新的XML文档。
package day06;//SAXREader 来自于 dom4j-1.6.1.jar 文件import java.io.FileInputStream;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;public class Demo1 { public static void main(String[] args) { try{ FileInputStream fis = new FileInputStream("book.xml"); SAXReader reader = new SAXReader(); /* * reader.read(byte流) * 返回doc 对象 */ Document doc = reader.read(fis); System.out.println(doc.asXML()); fis.close(); //访问根元素 //Element 来自 org.dom4j 包中的Element Element root = doc.getRootElement(); System.out.println(root.asXML()); }catch(Exception e){ //文件IO异常,XML文件的格式不是良好的 e.printStackTrace(); } }}
package day06;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;import org.junit.Test;public class TestCase { //@Test //测试方法:共有,无参数,无返回值 的测试方法 public void hello(){ System.out.println("Hello World"); } //@Test public void helloKitty(){ System.out.println("Hello Kitty"); } /** * 测试Element的elements方法 :获取全部的子元素 * 1.打开XML 得到 doc * 2.获取根元素 * 3.使用elements方法 获取根元素的 全部子元素 */ //@Test public void testElements() throws Exception{ FileInputStream fis = new FileInputStream("book.xml"); SAXReader reader = new SAXReader(); //获取DOM对象 org.dom4j.Document doc = reader.read(fis); fis.close(); //获取根元素 Element root = doc.getRootElement(); //List elements() //获取当前元素的全部子元素(集合) Listlist = root.elements(); //输出全部子元素 for(Element e : list){ //System.out.println(e.asXML()); } Element first = list.get(0); System.out.println(first.asXML()); List firstList = first.elements(); for(Element e : firstList){ System.out.println(e.asXML()); } } /** * 测试element方法 */ //@Test public void testElement() throws Exception{ FileInputStream fis = new FileInputStream("book.xml"); SAXReader reader = new SAXReader(); Document doc = reader.read(fis); fis.close(); Element root = doc.getRootElement(); //空指针异常,只能获取一级子节点 //System.out.println(root.element("author").asXML()); Element book = (Element)root.elements().get(0); //获取book中的 author子元素 Element author = book.element("author"); System.out.println(author.asXML()); //获取元素中的文本内容:String e.getText() //String e.getTextTrim() 并去除空白 String str = author.getTextTrim(); System.out.println(str); //练习 Element book4 = (Element)root.elements().get(3); Element absEle = book4.element("abstract"); str = absEle.getTextTrim(); System.out.println(str); //获取一个节点的名:String getName() //元素节点的名称就是标签的名称 String tag = author.getName(); System.out.println(tag); //dom4j提供了读取节点属性的方法 //String attributeValue("属性名") --返回属性值 //System.out.println(book.asXML()); String cata = book.attributeValue("catalog"); System.out.println(cata); //修改(添加)属性 addAttribute,在内存中修改(硬盘上文件的内容不变)! book.addAttribute("catalog","love"); System.out.println(book.asXML()); //修改节点的文本 author.setText("苍老师"); System.out.println(book.asXML()); //为元素增加子元素--home再添加一个book(为book添加name和author) Element newBook = root.addElement("book"); newBook.addAttribute("id","5"); Element n = newBook.addElement("name"); Element a = newBook.addElement("author"); n.setText("斗破苍穹"); a.setText("天蚕土豆"); System.out.println(root.asXML()); //将内存中的doc写出文件中:使用dom4j创建XML // XMLWriter 来自dom4j API 高级流 依赖低级的byte流 FileOutputStream fos = new FileOutputStream("book_new.xml"); //自动添加"空白节点" --dom4j的API //内存中的doc对象格式不受影响 OutputFormat ofmt = OutputFormat.createPrettyPrint(); XMLWriter xmlw = new XMLWriter(fos,ofmt); //将内存中的doc对象写出到文件中 xmlw.write(doc); xmlw.close(); } /** * 使用dom4j创建XML */ @Test public void testCreateDoc() throws Exception{ //创建空doc对象 Document doc = DocumentHelper.createDocument(); //添加根元素 Element root = doc.addElement("home"); //添加子元素 Element book = root.addElement("book"); //给book添加子元素name和author Element n = book.addElement("name"); n.setText("武动乾坤"); book.addElement("author").setText("土豆"); System.out.println(doc.asXML()); FileOutputStream fos = new FileOutputStream("book_doc.xml"); OutputFormat ofmt = OutputFormat.createPrettyPrint(); XMLWriter xmlw = new XMLWriter(fos,ofmt); xmlw.write(doc); xmlw.close(); } }
转载地址:http://ugews.baihongyu.com/