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 属性
语法:
注意:
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语法:
]]>
基本用法:
[注]:自从CDATA[开始,中间部分不能连续存放两个]],如果在文中穿插两个]]就会被理解为结束,一个]是允许的
2.7 处理指令(不推荐用)
作用: 主要告诉浏览器如何解析xml文件
希望提出出xml文件中对我们有用的内容,把标签忽略掉。
告诉浏览器该xml文档引用哪个css文档
[注]:使用了处理指令,xml文档和html文档的作用就类似了,都可以作为网页的结构。但xml的该功能基本已经不再使用了。
3.xml解析
3.1 xml解析方式
DOM解析: 一次性把xml文件加载进内存,然后在内存中构建Document树。比较消耗内存,并不适合读取容量大的xml文件。
SAX解析: 优势:内存占用非常小。加载一点,解析一点,处理一点,接着释放内存。但是只适合读取
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
1.4 获取所有子标签(不指定名称)
List
/**
* 注意,如果需要获取孙标签,首先得拿到子标签,再从子标签来获取孙标签!!!
*/
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
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);