xml文件常见问题及解答

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xzpdskll/article/details/49446255

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 />     其中、 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标签本身就使用了一些符号,与我们要使用的字符发生冲突就用另外的字符代替。
        例如:"<" 和 ">"  与我们的小于和大于冲突,就用&lt (小于) 和&gt(大于)代替
常见转义字符表
特殊字符 替代字符
& &amp
< &lt
> &gt
" &quot
' &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流
 
 









猜你喜欢

转载自blog.csdn.net/xzpdskll/article/details/49446255