xml文件常见问题及解答
1、文档的申明的问题
(1).文档的开头要说明你的文档类型
<?xml version="1.0" encoding="utf-8"?>
说明:<? ?> 中间写命令 version=“1.0” 表示本文档为xml1.0版本,encoding="utf-8"表示文档的编码类型为”utf-8“ 注:必须与你的文档的编码格式相同
(2).文档主要为标签模式---“<>”:开始标签 ”</>“:结束标签 元素可以包含数字、字母以及其它一些常见的字符
例如:<a></a> <body></body> <book></book> 可简写为: <a /> 其中a 、 body、 book 都为元素
2、文档标签书写规范
(1).一个标签也可以嵌套若干个子标签 例如:<a> <body></body> <book></book> <name></name> </a> 错误嵌套示例:<a> <body> </a> </body>
(2).一般情况或者一个格式良好的xml文件只包含一个根标签,其它标签都为根标签的子标签 例如:<a> <body></body> <book></book> <name></name> </a> a:标签为根标签,它内部都为它的子标签
(3).元素遵行的规范
a.区分大小写,例如,<P>和<p>是两个不同的标记。
b.不能以数字或者“_”(下划线)开头。
c.不能以xml(或者XML \或Xml等)开头。
d不能包含空格。
e. 名字的中间不能包含冒号(:)。
(4).一个标签可以包含 多个属性,每个属性都可以有它的名字(自定义)但必须遵行标签元素的命名规范和属性值,属性值必须以双引号(")或者单引号(')引起来
例如:<input name="text" /> name:为标签input的属性 text: 为name属性的属性值
注:属性也就可以用子标签代替 例如:<input> <name>text</name> </input>
3、文档的注释
(1).xml文档的文档类型申明之前不能有注释
例如:
(注释)
<?xml version="1.0" encoding="utf-8"?>
以上的注释就是错误的写法
(2).注释的写法
a.
<!--
........(大段注释)
-->
b. <!-- ....... (局部注释) -->
4.转义字符(即特殊符号的冲突处理)
由于xml标签本身就使用了一些符号,与我们要使用的字符发生冲突就用另外的字符代替。
例如:"<" 和 ">" 与我们的小于和大于冲突,就用< (小于) 和>(大于)代替
常见转义字符表
特殊字符 | 替代字符 |
& | & |
< | < |
> | > |
" | " |
' | &apos |
5.xml文档的约束
a.DTD约束
表明该文档必须遵循dtd的约束条件来书写,主要是内容的限制
例如:
DTD约束文件的内容:
<!ELEMENT book (书+)> 表明该文档根元素为且只有一个book 即:<book></book> 子元素有一个或多个 “书” 即:<书> </书> ...
<!ELEMENT 书 (书名,作者,售价)> 表示子标签<书></书> 有且仅有以下子标签 :<书名></书名> <作者></作者> <售价></售价>
<!ELEMENT 书名 (#PCDATA)> 表示该标签可包含的内容为:字符串
<!ELEMENT 作者 (#PCDATA)>表示该标签可包含的内容为:字符串
<!ELEMENT 售价 (#PCDATA)>表示该标签可包含的内容为:字符串
xml文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book SYSTEM "book.dtd"> <!--本地DTD文档的引用-->
<book>
<书>
<书名>JAVA2EE</书名>
<作者>张松</作者>
<售价>39.00元</售价>
</书>
<书>
<书名>网页平面设计</书名>
<作者>灌中</作者>
<售价>28.00元</售价>
</book>
1.本地DTD文档的引用格式
<!DOCTYPE 文档的根节点 SYSTEM "DTD文件的URL">
例如:<!DOCTYPE book SYSTEM "book.dtd">
2.公共或者网上异地DTD文档的引用格式
<!DOCTYPE 文档的根节点 PUBLIC "DTD名称"
"DTD文件的URL
">
例如:<!DOCTYPE web-app PUBLIC
“-//Sun Microsystem, Inc.//DTD Web Application 2.3//EN”
"http://java.sun.com/dtd/web-app_2_3.dtd" >
元素的定义:
1.在DTD文档使用ELEMENT声明一个xml元素
语法格式:<!ELEMENT 元素的名称 元素的类型 >
2.元素的类型也可以是内容或者类型
1)如果为元素的内容就用()括起来
如:<!ELEMENT 书架 (书名 ,作者,售价)>
<!ELEMENT 书名(#PCDATA)>
2) 如果为元素的类型则直接书写
EMPTY:用于定义空的元素 如 :<!ELEMENT br EMPTY> 则xml文档为: <br /> <hr />
ANY:用于表示内容为任意的类型
3.元素的内容可以是以下的方式:
","(逗号)表示内容的出现的先后 <!ELEMENT MYFILE (TITLE,AUTHOR,EMAIL)>
"|"表示或者 <!ELEMENT MYFILE (TITLE|AUTHOR|EMAIL)>
4.元素内容中也可以用如下的符号表示元素出现的次数:
“+” 一次或多次 (书+)
“?“ 0次或者一次 (书?)
"*" 0次或多次(书*)
(书)表示至少出现一次
5.也可以用圆括号()进行批量的设置
如:<!ELEMENT MYFILE ((TITLE*,AUTHOR?,EMAIL) | COMMENT)>
6.使用ATTLIST为标签设置属性
语法格式:
<!ATTLIST 元素名
属性名1 属性的类型 设置的说明
属性名2
属性的类型 设置的说明
........
>
例如:<!ATTLIST 书
类别 CDATA #REQUIRED
颜色 CDATA #IMPLIED
>
#REQUIRED:表示该属性为必须设置
#IMPLIED :表示该属性为可设置也可以不设置
#FIXED :表示该属性为必须设置的,且属性的值唯一
”值“ :表示如果没有设置该值,则为该值的默认值
7.使用ENTITY 为定义实体
语法规则:
<!ENTITY 实体的名称 ”实体的内容 “ >
引用的方式:
&实体名称;
例如:<!ENTITY MYNAME "I am a programmer">
&MYNAME; 等价于 I am a programmer
8.使用ATTLIST定义参数实体
语法规则:
<!ENTITY % 实体的名称 ”实体的内容 “ >
引用的方式:
&实体名称;
例如:
1:
<!ENTITY % MYNAME "I am a programmer">
&MYNAME; 等价于 I am a programmer
2:
<!ENTITY % attr " id ID #IMPLIED account CDATA #IMPLIED">
定义属性时:<!ATTLIST ODER %attr;>
注:DTD文件只可应用于UTF-8或者unicode编码格式的文档
6.xml编程(CRUD)
1.两种解析方式:
1.DOM解析
2.SAX解析
2.两种解析的优缺点:
1.dom解析的优点是对文档的crud比较方便,缺点是占用内存比较大
2.sax解析的优点是占用内存比较少,解析速度比较快,缺点是只适合文档的读取,不适合文档的CRUD
3.利用dom4j开发包对xml进行解析
1)导入dom4j的开发包 dom4j-1.6.jar
2) 创建SAXReader 对象 SAXReader reader = new SAXReader()
3)获得dom.xml文档的document Document document = reader..read( new File("dom.xml"));
4)用document的getRootElement()方法获得根节点 Element root = document.getRootElement();
5) 利用根节点的elements()方法获得子节点集 get(序号值)方法 获得某个子节点 Element node = (Element) root.element("子节点名称").get(i);
6) 获得子节点的值getText()方法 String value = node.element("子节点名").getText();
7) 获得子节点的属性值 String attrvalue = node.attribute("属性名称").getValue(); 或者 String attrvalue = node.attributeValue("属性的名称");
8) 添加子节点 root.addElement("节点的名称").setText("节点内容");
更新dom.xm文档
a. OutputFormat format = OutputFormat.createPrettyPrint(); ( format.setEncoding("GB2132"); )
b. XMlWriter writer = new XMLWriter(new FileOutputStream("dom.xml"),format); 得到XMlWriter对象
c. writer.write(document);
写入document
d. writer.close();
关闭write流
9) 在指定位置上添加子节点
<span style="white-space:pre"> </span>List list = root.elements();
Element node1 = DocumentHelper.createElement("节点名");
node1.setText("内容");
list.add(2,node1);
<span style="font-family: Arial, Helvetica, sans-serif;"> </span><span style="font-family: Arial, Helvetica, sans-serif;"> <span style="white-space: pre;">1</span>0)删除指定的节点</span>
<pre name="code" class="java"><span style="white-space:pre"> </span>SAXReader reader = new SAXReader();
<span style="white-space:pre"> </span>Document document = reader.read(new File("dom.xml"));
<span style="white-space:pre"> </span>Element author = document.getParent().remove(author);
<span style="white-space:pre"> </span>OutputFormat format = OutputFormat.createPrettyPrint();
<span style="white-space:pre"> </span>format.setEncoding("utf-8");
XMlWriter writer = new XMLWriter(new FileOutputStream("dom.xml"),format); //得到XMlWriter对象
writer.write(document); 写入document
writer.close(); //关闭write流