xml语言

1.1 编码问题:
ansi  编码 是 american national standard insititution 美国国家标准协会 ,
ansi 编码在不同的国家不一样的 
ansi ->gb2312(简体 大陆)    anis-gbk big5(繁体  台湾 香港)
日本 ansi->日文操作系统默认的编码.

[注]:由于xml文件头需要设定编码方式,所以文件与设定的编码方式需要保持一直

2.1 标签

xml的标签是自定义标签

语法: 张三

注意:
  1)严格区分大小写
  2)标签名不能以数字开头。只能以字母或下划线开头,中文。
  3)标签名不能包含空格
  4)如果没有使用名称空间,标签名不能包含冒号
  5)在一个xml文档中,只允许有且仅有一个根标签

xml语法小结:
XML声明语句
//这里gb2312也可以是utf-8,一般是utf-8
–    必须有且仅有一个根元素
–    标记大小写敏感(保持一致)
–    属性值用引号
–    标记成对(除非自闭标签)
–    空标记关闭     ==  (自闭标签)
–    元素正确嵌套
–    名称中可以包含字母、数字或者其它字符(不能数字开头)
–    名称中不能含空格 测
–    名称中不能含冒号(注:冒号留给命名空间使用)

 

2.2 属性

语法: lisi
注意:
 1)属性放在开始标签中。
 2)属性值必须放在双引号或单引号中,不能省略引号,也不能单双混用。
 3)在一个标签中,属性可以有多个,但不能出现同名的属性。//多个属性之间用空格隔开

属性值用双引号(")或单引号(')分隔(如果属性值中有',用"分隔;有",用'分隔)

一个元素可以有多个属性,它的基本格式为:<元素名 属性名="属性值">

特定的属性名称在同一个元素标记中只能出现一次 属性值不能包括<, >, &

2.3 注释

语法:

2.4 文档声明

语法:

 version: 表示xml的版本号,一般都是1.0
 encoding: 浏览器打开xml文件时(解码)查询码表

xml文档编码问题注意:
 1)ecplise工具会自动根据xml文件的文档声明自动设置保存时的编码,所以在ecplise中编写xml文件通常不会有编码问题。
 2)但是如果使用记事本工具,那么注意保存xml文件的编码和文件声明的编码保持一致!

2.5 转义字符
如果希望在xml文件中原样输出xml中的特殊字符,那么就需要对其进行转义。

 转义字符:
     <         <
     >         >
     "         "
     &        &
     空格       

2.6 CDATA块

CDATA块的作用,如果xml中的一段内容都希望原样输出,可以把这段内容包含在CDATA块中。

 CADATA语法:
 
]]> 


基本用法:
;akdf0sa98u329408><>>学生]]>

[注]:自从CDATA[开始,中间部分不能连续存放两个]],如果在文中穿插两个]]就会被理解为结束,一个]是允许的

2.7 处理指令(不推荐用)

作用: 主要告诉浏览器如何解析xml文件

希望提出出xml文件中对我们有用的内容,把标签忽略掉。

    告诉浏览器该xml文档引用哪个css文档


 [注]:使用了处理指令,xml文档和html文档的作用就类似了,都可以作为网页的结构。但xml的该功能基本已经不再使用了。

3.xml解析

3.1 xml解析方式

DOM解析: 一次性把xml文件加载进内存,然后在内存中构建Document树。比较消耗内存,并不适合读取容量大的xml文件。

SAX解析: 优势:内存占用非常小。加载一点,解析一点,处理一点,接着释放内存。但是只适合读取

 

2. DOM解析的工具

Sun官方jaxp工具

jdom工具

dom4j工具:三大框架读取xml文件的程序(非官方)

dom4j工具: 三大框架读取xml文件的程序。(非官方的,第三方的)

 

DOM解析

SAX解析

原理

一次性加载xml文档,内存占用比较大

加载一点,读取一点,处理一点,释放内存,内存占用较小

读取顺序

DOM可以任意在文档读取,甚至往回读

SAX解析从上往下依次读取,不能往回读

操作xml

DOM解析可以 增删改查 操作

SAX解析只能 读取

编程方法

基于对象编程模式,更加符合java开发者思维

基于事件编程模式,编程相对复杂。

1)创建xml解析器对象
 SAXReader reader = new SAXReader();
2)读取xml文件
 Document doc = reader.read(new File("./src/contact.xml"));
 System.out.println(doc);
3)读取标签和属性

使用dom4j读取xml的标签
 *      getRootElement(): 获取根标签
 *      getName(): 获取标签名称
 *      element("名称"): 获取第一个指定名称的子标签
 *      elements("名称"): 获取指定名称的所有的子标签
 *      elements(): 获取所有子标签(直接子标签)
-------------------------------------------------------------
读取标签:
1.1 读取根标签
Document.getRootElement();
1.2 获取标签名称
rootElem.getName();

1.3 获取第一个子标签(根据指定的名称获取第一个子标签)
Element conElem = rootElem.element("contact");

1.4 获取所有子标签(根据指定的名称获取所有同名子标签)
List list = rootElem.elements("contact");

1.4 获取所有子标签(不指定名称)
List eList = rootElem.elements();

/**
 * 注意,如果需要获取孙标签,首先得拿到子标签,再从子标签来获取孙标签!!!
 */
Element nameElem  = rootElem.element("contact").element("name");

读取属性:

/**
 *
 * 注意:获取属性,必须先得到属性所在的标签
 */
//1.1 在标签上获取属性值(根据属性名称获取对应的属性值)
 String value = conElem.attributeValue("id");

// 拿到getRootElement的第一个子标签,并且获取他的id属性
Element conElem2 = (Element)doc.getRootElement().elements().get(1);
System.out.println(conElem2.attributeValue("id"));

//1.2 根据属性名称获取属性对象
//拿到标签对象
 conElem = doc.getRootElement().element("contact");
//拿到属性对象
 Attribute idAttr = conElem.attribute("id");
//通过属性对象拿到 属性名
 String idName = idAttr.getName();
//通过属性对象拿到 属性值
 String idValue = idAttr.getValue();

//1.3 获取标签的所有属性对象
 conElem = doc.getRootElement().element("contact");
 List attrList = conElem.attributes();

dom4j修改xml内容

(1)需求:使用dom4j获取xml的文本信息
/**
 * 注意:
 *     在xml文件中,空格和换行会作为xml的内容被解析到。
 *     xml中空格和换行和java代码中空格换行不一样。
 *     java代码中的空格和换行是没意义的,为了代码的格式格式好看而已。
 */
Element con = doc.getRootElement().element("contact");
System.out.println(con.getText());

// 注意: 获取文本,要先获取文所在的标签对象
//1.1 拿到所在标签上的文本内容本
Element nameElem = doc.getRootElement().element("contact").element("name");
String content = nameElem.getText();

//1.2 通过父标签获取指定子标签的文本内容
 Element conElem = doc.getRootElement().element("contact");
 content = conElem.elementText("gender");

SAXreader和DocumentHelper用法:

DocumentHelper

1.1 添加空文档
 Document doc = DocumentHelper.createDocument();//模板开始
1.2 添加根标签
 Element conListElem = doc.addElement("contact-list");
//doc.addElement("contact-list"); //不能添加两个根标签!!!!!

1.3在做完修改之后利用outputstream写到文件中去:

        String xmlPath = "src/contacts.xml";
		//System.out.println(doc.getName());
		//System.out.println(doc.getPath());
		//需要把内存中的数据 重新写入文件中  createCompactFormat()没有格式
		OutputFormat output = OutputFormat.createPrettyPrint();
		output.setEncoding("utf-8");//输出的编码utf-8
		
XMLWriter writer = new XMLWriter(new FileOutputStream(new File(xmlPath)),output);
		

SAXreader:

    SAXReader reader = new SAXReader();
    File file = new File("src/contacts.xml");
    doc = reader.read(file);

add()
//1.1 添加空文档
 Document doc = DocumentHelper.createDocument();//模板开始
		
//1.2 添加标签
 Element conListElem = doc.addElement("contact-list");
//doc.addElement("contact-list"); //不能添加两个根标签!!!

 Element conElem = conListElem.addElement("contact");
 conElem.addElement("name");
		
//1.3 添加属性
 conElem.addAttribute("id", "001");
 conElem.addAttribute("name","eric");

//1.2 把文档写出到xml文件中 //  模板 保存
 OutputStream out = new FileOutputStream("e:/contact.xml");
 OutputFormat format = OutputFormat.createPrettyPrint();
 format.setEncoding("utf-8");
		
 XMLWriter writer = new XMLWriter(out,format);
 writer.write(doc);
//----------------------------------------------------------------------
edit()
//修改属性
//1.1 先得到属性对象,再调用方法修改属性值
 /*Element conElem = doc.getRootElement().element("contact");
 Attribute idAttr = conElem.attribute("id");
 idAttr.setValue("003");*/
		
 //1.2 在标签中添加同名的属性,覆盖属性值
 Element conElem = doc.getRootElement().element("contact");
 conElem.addAttribute("id", "004");
		
 //修改文本
 Element nameElem = doc.getRootElement().element("contact").element("name");
 nameElem.setText("王五");

 //1.2 把文档写出到xml文件中
 OutputStream out = new FileOutputStream("e:/contact.xml");
 OutputFormat format = OutputFormat.createPrettyPrint();
 format.setEncoding("utf-8");
		
 XMLWriter writer = new XMLWriter(out,format);
 writer.write(doc);
//-------------------------------------------------------------------------------
delete()
删除标签或属性

Document doc = new SAXReader().read(new File("./src/contact.xml"));
/**
 * 删除
 */
/*//1.1 删除标签
 Element conElem = doc.getRootElement().element("contact");
 //conElem.detach(); //自杀
 conElem.getParent().remove(conElem); //他杀
*/		

 //1.2 删除属性
 Attribute idAttr = doc.getRootElement().element("contact").attribute("id");
 idAttr.detach();
		
		
 //1.2 把文档写出到xml文件中
 OutputStream out = new FileOutputStream("e:/contact.xml");
 OutputFormat format = OutputFormat.createPrettyPrint();
 format.setEncoding("utf-8");
		
 XMLWriter writer = new XMLWriter(out,format);
 writer.write(doc);

 

你可能感兴趣的:(java)