xml学习心得笔记

来源:互联网 发布:淘宝砖石卖家信誉好吗 编辑:程序博客网 时间:2024/06/02 04:05

1 XML语法

1.1 XML用途

XML,(Extensible Markup Language)可扩展标记语言,独立于软件、硬件的信息传输工具,应用于web开发,常用于简化数据的存储、共享(传输)、跨平台(系统)、跨语言(各种语言都能用)。

【个人见解】:xml类似于正则表达式,不是sum公司的,是个独立的东西;

1.2 基本语法

1.2.1 XML指令

PI(processing instruction)处理指令,指挥解析引擎如何解析XML文档内容。
e.g:<?xml version="1.0" encoding="utf-8" ?>---自动生成(永远在xml文档的第一行)

【个人见解】:
  • 在XML中,所有的处理指令都是以<?开头,?>结尾,中间是处理指令的名称;
  • PI要求必须指定一个version属性,可选standalone---是否允许使用外部xml文件声明(yes/no-默认)、encoding---指作者使用的字符编码格式(UTF-8、gb2312);

1.2.2 元素、属性

xml元素---从开始标签~结束标签的部分,元素可以包含其他元素、文本、或者两者混合物,元素也可以拥有属性。

<datasource id="db_orcale">                           //dabasource--一个元素,其包含其他元素,例如property    <property name="url">         jdbc:thin@192.168.0.26:1521:tarena           //property--一个元素,也可以包含元素、文本    </property>    <property name="dbUser">openlab</property>        //元素也可以有属性,例如property具有name属性    <property name="url">open123</property></datasource>

属性(Attribute)---提供关于元素额外(附加)信息,通常这些信息不属于数据组成部分,但是对于处理这个元素得应用程序来说是很重要的。


【个人见解】:如果属性内部需要用到“ ”,则属性外部就要用‘ ’

1.2.3 大小写敏感

XML文档中对大小写很敏感,<Data>和<data>是不一样的,打开标签和关闭标签必须写成相同的,必须成对出现。

1.2.4 元素必须要有关闭标签


1.2.5 必须要有根元素(根元素只能有一个)


1.2.6 元素必须正确嵌套(开始标签、结束标签不能在不同元素之间交叉定义)


1.2.7 实体引用

实体---常用的短语、键盘字符、文件、数据库记录、任何包含数据的项。在XML中,有时实体内包含了一些字符,如& < > " ' 等,这些均是需要转义的,否则会被XML解析器生成错误。

xml常用实体引用



【个人见解】:实体还是可以自己声明的

1.2.8 CDATA段

格式:< ! [ CDATA [   文本内容 ] ] >


2 XML解析方式

2.1 SAX解析方式

SAX(simple API for XML)解析,逐行扫描文档,一边扫描一边解析。

    优点:解析可以立即开始,速度快、没有内存压力;
    缺点:不能对节点进行修改;


2.2 DOM解析方式

DOM(Document Object Model)文档对象模型,解析过程中,先将文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。

    优点:将XMl文件在内存中构建树形结构,可以遍历、修改节点;
    缺点:若文件较大,则会造成内存有压力,解析时间会比较长;

【个人见解】:相对于DOM,SAX可以在解析文档的任意时刻停止解析;另外,Android解析XML文件使用的是SAX。

3 读取XML

package XML;import java.io.File;import java.util.ArrayList;import java.util.List;import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader; //使用SAXReader需要导入dom4j-full.jar包,其是DOM4J类的一个核心API,用于读取XML文档/* * DOM4J是一个java的XML API,类似于JDOM,用于读写XML文件的。DOM4J是一个非常优秀的java XML API,是一个开源的软件 *//* * 通过DOM来解析xml(不管怎么说也得读嘛,所以必须得通过SAXReader读) * * 解析xml文件的流程: *  1、创建SAXReader,用于读取xml文件 *  2、指定xml文件使得SAXReader读取,并解析文档对象Document *  3、获取根元素/根标签/根节点 *  4、获取每个元素,从而达到解析的目的(没有固定的写法) */public class xmlDemo {//要想解析xml文件,则必须读xml文件,即定义IO流,则必须用try-catchpublic static void main(String[] args) {try{//1、创建SAXReaderSAXReader reader=new SAXReader(); //字符流(以Reader结尾,且xml文件里边存放的都是字符)//2、读取指定xml文件File xmlFile=new File("emp.xml");/* * 常用的读取方法: * Document read(InputStream in) //字节输入流 * Document read(Reader read) //Reader-字符输入流 父类 * Document read(File file) //直接给定一个文件 */Document doc=reader.read(xmlFile);/* * read方法的作用: * 1、读取给定的xml,并将其解析转换成一个Document对象 * 2、实际上这里已经完成了对整个xml解析的工作,并将所有的内容封装到一个Document对象中 * 3、Document对象可以描述当前xml文档 *//* * Document对象是一颗文档树的根,为我们提供访问文档数据的最顶层的入口; * 当我们得到Document对象后,就相当于得到整个XMl描述的树结构,接下来第一步就是,先获取根元素 *///3、获取根元素Element root=doc.getRootElement(); //Document提供了一个方法Element getRootElement()获取根标签(一个Element对象)/* * Element类,Element-用于描述XML中的一个元素 *///4、获取下级元素(【注意】:只管向下一级)//【补充知识点】:/* * Element类,提供了一系列方法: * 1、Element element(String name);//获取当前元素下,第一个叫这个指定名字的子元素(还是一个Element对象) * 2、List elements(); //获取当前元素下,所有的子元素(elements有很多重载方法) * 3、List elements(String name); //获取当前元素下,所有同名(即都是叫指定的这个名字)的子元素 * 4、String getName(); //获取当前元素的名字 * 5、String getText(); //获取当前元素的文本节点(即开始、结束标签之间的文本) * 6、String getTextTrim(); //在上边基础上,去除文本两端的空格 * 7、Attribute attribute(int index); //获取当前元素的指定属性,从0开始 * 8、Attribute attribute(String name); //获取当前元素的指定名字的属性  */List elements=root.elements(); //返回所有子元素(Element对象)集合,//这边返回的是每个emp元素,即该集合中保存的是多个emp元素,但是只是一个Element对象/* * 创建一个集合,用于保存xml中的每个用户的信息; * 【1】先将用户信息取出; * 【2】再创建一个Emp实例,将信息设置到该实例的对应属性上 * 【3】最终将所有的emp对象存入该集合中 */List list=new ArrayList();/* * 遍历出每一个emp元素(标签) */for(Element emp:elements){ //从elements集合中,遍历数据存到emp变量中(emp是Element类型)//解析emp标签/* * 【1】首先,获取当前emp标签下,名为name的子标签 * 【2】其次,获取前后标签中间的文本 *///获取名字//Element ename=emp.element("name");//String name=ename.getText();//确保当前标签的开始结束标签中间是文本//String name=ename.getTextTrim();//将中间文本的两端空去掉//或者:/* * String elementText(String name) * 获取当前标签中,名为给定名字的子标签中间的文本。该方法与上边获取“name”的两句话等效 */String name=emp.elementText("name");//获取年龄(由于上边方法返回的是String类型,所以这里需要将String类型转换为int类型)String ageStr=emp.elementText("age");int age=Integer.parseInt(ageStr);String gendar=emp.elementText("gendar");String doubleStr=emp.elementText("salary");double salary=Double.parseDouble(doubleStr);//创建Emp对象,用于保存信息Emp e=new Emp();e.setName(name);e.setAge(age);e.setGendar(gendar);e.setSalary(salary);/* * 通过Element获取元素属性: * 1、Attribute attribute(int index);//获取当前标签的第几个属性 * 2、Attribute attribute(String name);//获取当前标签的name属性 *//* * Attribute类:(其每个实例,都描述了(某个元素的)某个 属性信息 ) * 【根据Attribute对象,通常我们会获取其对应的属性名、属性值】,具体方法: * 1、String getName(); //获取属性的名字 * 2、String getValue(); //获取属性的值  *///获取id属性Attribute attr=emp.attribute("id");int id=Integer.parseInt(attr.getValue());e.setId(id);//将Emp对象存入集合list.add(e);}System.out.println("解析了"+list.size()+"个员工信息");//循环输出每个员工的信息for(Emp e:list){System.out.println(e);}}catch(Exception e){}}}

4 写出XML

package XML;import java.io.FileOutputStream;import java.util.ArrayList;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.XMLWriter;/* * 使用DOM4J,可以自行构建Document对象,并组建树状结构来描述一个XML文档,并使用DOM4J将其写出到一个文件中 *//* * 使用DOM写出一个XML *  * 生成XML文件的基本步骤: * 1、创建Document对象 * 2、为Document添加根节点 * 3、为根节点组建树状结构(根据具体需求,不一定需要) * 4、Document构建好后,通过创建XMLWriter来输出 * 5、为XMLWriter指定写出目标路径 * 6、写出XML */public class writeXML {public static void main(String[] args) {try{//1、创建Document对象/* * DOM4J提供了一个类:DocumentHelper, * 该类提供了一个静态方法:static Document createDocument()---用于创建Document对象 */Document doc=DocumentHelper.createDocument();//2、添加根元素(由于之前了解知道。Element通常是用来描述XML中的一个元素的,所以我们要向Document对象添加一个Element,来表示根元素)/* * Document提供了一个方法: * Element addElement(String name) //向Document中添加,指定名字的根元素 * 【1】:该方法只能调用一次,否则会抛出异常---“文档已存在根元素” * 【2】:根元素添加完毕后,该方法返回---根元素所对应的Element对象,以便后续根据根元素组织整个树 */Element root=doc.addElement("list");//3、向根元素中添加子元素/* * Element类提供一系列方法:(供应添加子元素、属性、文本等等) * 1、Element addElement(String name) //向该元素添加子元素,返回其对应的element对象 *     【注意】这个方法可以调用多回(因为根元素下边可以有很多个子emp元素)    * 2、Element addText(String text) //向元素得文本节点,追加 文本信息 * 3、Element setText(String text) //向元素得文本节点,设置 文本信息 * 4、Element addAttribute(String name,String value) //给当前元素添加给定属性名字,以及对应的属性值(类似于StringBuilder的append方法) *      【目的】:降低了连续添加元素时的代码复杂度 *///这里先自己手动创建一个集合,存放将要放入xml文件中的几个emp信息List list=new ArrayList();list.add(new Emp(1,"霍霍",12,"男",3600.56));list.add(new Emp(2,"霍霍2",23,"女",2600.56));list.add(new Emp(3,"霍霍3",36,"男",8600.56));list.add(new Emp(4,"霍霍4",56,"女",15600.56));list.add(new Emp(5,"霍霍5",8,"男",10.56));//添加完根元素后,循环(从设置的list中将每个emp)写出到给定的xml文件中for(int i=0;i