XML笔记

来源:互联网 发布:个人数字图书馆软件 编辑:程序博客网 时间:2024/05/22 06:58

1. Xml的介绍:

xml技术用于解决什么问题?
Xml ---eXtensible Markup Language 的缩写,  可扩展的标记语言. --------- w3c组织 制定的.
XML 被设计用来传输和存储数据
XML标签没有被预定义,需要用户自行定义标签。
XML技术是W3C组织(World Wide Web Consortium万维网联盟)发布的,目前遵循的是W3C组织于2000年发布的XML1.0规范。
XML被广泛认为是继Java之后在Internet上最激动人心的新技术。
实际上就是类似于html 但是 很多的标签都是自定义的

 

xml语言用于描述类似上面的有关系的数据
它允许用户自定义标签,一个标签用于描述一段数据,一个标签可以分为开始标签和结束标签在开始标签和结束标签之间又可以使用其它标签描述其它的数据,以此来实现数据关系描述,例如:
<?xml version="1.0" encoding="utf-8"?>
<personList>
<person>
<id>20141001</id>
<name>Bill Gates</name>
<age>60</age>
</person>
<person>
<id>20141002</id>
<name>StevenJobs</name>
<age>68</age>
</person>
</personList>

通过解析器将xml解析出来
xml是一种通用的数据交换格式 ,通常用于交换数据和保存程序的配制信息
使用xml还是properties?
如果 配置文件中的数据是有关系的,那么就用xml ,否则就用 properties 文件

2. Xml的语法(了解):

Xml语法实际上就是告诉你如何去写一个xml文件不报错.  

 

2.1. 文档声明:

<?xml version=1.0?> 文档声明 必须要出现在xml文件的第一行.  一般情况下 xml文件的扩展名就是 .xml , 但是不仅仅局限于.xml 扩展名
Xml文件中声明了xml文件的编码格式.
 注意: 如果出现乱码的问题, 要检查保存的编码和解析时的编码是否一致。

2.2. Xml的元素:

Xml元素就是咱们所了解的标签 一般情况下 别人在说道 html的元素或者xml的元素的时候,就指的是标签
在写xml的元素的时候,不要 嵌套
一个XML文档必须有且仅有一个根标签,其他标签都是这个根标签的子标签或孙标签。
对于标签中出现的所有空格和换行,解析程序都会当作标签内容进行处理,例如:
<person>
<name>name</name>
<age>20</age>
</person>
与:
<person><name>name</name><age>20</age></person>
的意义是不一样的。由于空格和换行都会作为原始内容处理,所以,在编写xml时可以去除多余的空格和换行来减少干扰,提高解析速度。

l 命名规范:

一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:

区分大小写,例如,<P><p>是两个不同的标记。
不能以数字或"_" (下划线)开头。
不能以xml(XML、或Xml )开头。  
不能包含空格。
名称中间不能包含冒号(:) (有特殊用途)
属性都是 某个元素的,  html,每个标签会有一些特定的属性,那么在定义xml 的元素时,也是可以添加一些属性的命名规范与
刚刚的 元素的命令规范是一样的.
Xml的属性的值必须要使用 “”  或这 ‘’ 引起来
XML技术中,标签属性所代表的信息,如果没有标签体,也可以被改成用子元素的形式来描述,例如:
<mytag>
<name>
<firstname></firstnamename>
<secondname></secondname>
</name>
</mytag>
Xml的注释与html的注释是一样的
同样的,注释不要嵌套就好了
Character data area ---- 字符数据区 通常有些文本内容不想当多xml 的标签内容去处理那么这个时候就可以使用 cdata区 来 描述了 .
作用:把标签当做普通文本内容;
语法:<![CDATA[内容]]>
Great than  : 大于
less than :小于
Apostrophe: 单引号
ampersand : and 符号
quotation : 双引号
PI ----- processing instruction ---处理指令
作用:用来指挥软件如何解析XML文档。
语法:必须以“<?”作为开头,以“?>”作为结尾。
常用处理指令:
XML声明:<?xml version=1.0” encoding=GB2312?>
xml-stylesheet指令:
作用:指示XML文档所使用的CSS样式XSL
Xml约束是用来 约束一个xml文档到底应该怎么去写的
Xml文件中的内容不能乱写一个框架的设计者在设计这个框架的时候,就肯定要使用约束技术来 约束 框架的使用者到底该如何去
书写这个xml 文件这些规则主要就包括 (元素的出现顺序,元素定义元素中属性值的类型,属性的名称等等一系列的信息)
Xml的约束 技术到底有哪些 呢
Dtd , schema ---- 这两个技术也并不仅仅用在 约束 xml 还用在一些其他的地方.例如: dtd 就还用在了 html 文档中
Dtd 出现了之后,很多技术中都使用到了,但是有些 不好,例如不能对 数据的类型做出 更加精确的限定,为了克服这种局限性,所以就
弄出了 schema 技术来取代 dtd . (一些近些年出现的新的技术,一般都使用的 schema约束例如, android )
Schema是趋势咱们的重点是掌握 schema技术
Schema是重点-------- 对于大家的要求能够看明白 一个个现成的已经提供好的schema 文档就够了能够根据这文档写出 对应的
符合规范的xml文件.  (并不要求能够自己去写一个 schema 文档出来. )
学习这约束技术的时候首先学dtd,然后学schema (dtd 简单,schema 很复杂 )
DTD(Document Type Definition),全称为文档类型定义。
Dtd文件的内容:
<!ELEMENT personList ANY>
<!ELEMENT person (id,name,age)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
对于编写 xml , 如果要进行 校验,那么可以使用 工具 MyEclipse的Run Validation菜单手动去校验 
如果没有自动校验可以手动的去 运行校验 一下
可以在xml文件中使用 命令来引入外部的dtd 文件,也可以直接将dtd 的内容就写在xml文件内部
   在内部直接写 
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE personList[
<!ELEMENT personList ANY>
<!ELEMENT person (id,name,age)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<personList>
<person>
<id>20141001</id>
<name>雷军</name>
<age>60</age>
</person>
<person>
<id>20141002</id>
<name>StevenJobs</name>
<age>68</age>
</person>
</personList>
引入外部的文件:
第一种:dtd文件在本地
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE personList SYSTEM "person.dtd">
<personList>
<person>
<id>20141001</id>
<name>BillGates</name>
<age>60</age>
</person>
<person>
<id>20141002</id>
<name>StevenJobs</name>
<age>68</age>
</person>
</personList>
<!DOCTYPE personList SYSTEM "person.dtd">表示 引入的文件 在本地其中  DOCTYPE是固定的需要大写跟上 根标签 名字, SYSTEM 表示      文件在本地空格跟上 文件的路径
第二种--dtd文件在互联网上: 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
包括的各个部分的意思:
DOCTYPE:  表示引入dtd文件,是固定的
Html:  根标签的名字, 是html
PUBLIC: 是互联网上的一个 公共的 dtd文件
"-//W3C//DTD HTML 4.01 Transitional//EN": dtd在互联网上的名称
"http://www.w3.org/TR/html4/loose.dtd": dtd 的路径
属性定义:
Attribute---- 
 
在定义 属性的时设置的说明  部分  是有一些固定的值的 .
举例:
      <!ATTLIST 页面作者 
     姓名 CDATA #IMPLIED 
     年龄 CDATA #IMPLIED 
     联系信息 CDATA #REQUIRED 
     网站职务 CDATA #FIXED "页面作者" 
     个人爱好 CDATA "上网"> 
在定义 属性的时属性值  部分  是有一些固定的值的 .
CDATA:表示属性值为普通文本字符串。
ENUMERATED : 枚举提供的若干的值中的一个
ID  identity: id类型的值,是唯一的,  在写id时必须要以 字母开始,不能以 数字 开始并且id 不运行重复
ENTITY(实体): 为了实现 复用而定义的.
l 实体定义:
DTD定义中,一条<!ENTITY >语句用于定义一个实体。
实体可分为两种类型:引用实体和参数实体。
参数实体是在dtd文件中使用 
<!ENTITY % 实体名称 "实体内容" >  --- 引用 :  %实体名称;
引用实体xml文件中使用的 
<!ENTITY 实体名称 "实体内容">---- 引用  &实体名称;
Xml是用来表示数据,存储数据的肯定会涉及到 向xml 中 crud数据操作
Xml是一个非常流行的 通过数据交换的格式
Xml文件中的数据要通过 解析 程序 读取出来然后去操作. Xml 非常流行,所以 要解析xml的程序就会有很多种每一种我们都称之为
解析器.(解析器就有很多种了,这么多解析器肯定有好的,肯定有更好的, )
最终的pk的结果是 :  dom4j的解析器 以及一个叫做 pull的解析器完胜。
Xml 会用在不同平台下, dom4j是用在javaee中的开发比较多的, pull解析器是用在android 中比较多的.
Dom4j, dom, sax
l dom解析器:
Html的时候学了 html dom(document object model ) ,那么在这里的 xmldom解析器也叫做 xml dom (文档对象模型)
Dom---文档对象模型现在将 xml dom----- 现在的文档 就是xml 文件了
 SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂。
Dom4j解析器:  dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。在IBM developerWorks上面可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在哪个方面都是非常出色的。这是必须使用的jar包, Hibernate用它来读写配置文件
 JAXP: 一个 开发包---集成了 dom和 sax两种解析器这个包 也集成 到  标准的jdk 中去了. (你安装的jdk中就有了这两种解析的包的实现) 
使用DocumentBuilderFactory对xml进行Crud 增删改查操作
<span style="font-size:18px;">publicclassXmlUtil{privatestaticString xmlFile="res/person.xml";privatestaticXmlUtil xu=newXmlUtil();Document document =null;privateXmlUtil(){try{DocumentBuilder db=DocumentBuilderFactory.newInstance().newDocumentBuilder();document = db.parse(newFile(xmlFile));//创建一个document对象}catch(Exception e){e.printStackTrace();}}publicstaticXmlUtil getInstance(){return xu;}//获取根节点publicNode getRootNode(){Node n=null;try{NodeList nodeList = document.getChildNodes(); n=nodeList.item(0);}catch(Exception e){e.printStackTrace();}return n;}publicNode getNode(String nodeName,int i){return document.getElementsByTagName(nodeName).item(i);}publicDocument getDocument(){return document;}//增加节点publicvoid addNode(Node nodeParent,Node newChild){nodeParent.appendChild(newChild);}//删除节点publicvoid deleteNode(Node node){node.getParentNode().removeChild(node);}//修改节点publicvoid updateNode(Node node,String str){node.setTextContent(str);}//保存xmlpublicvoid save2Xml(Document document,String tarXml){try{Transformer transformer =TransformerFactory.newInstance().newTransformer();transformer.transform(newDOMSource(document),newStreamResult(tarXml));}catch(Exception e){// TODO Auto-generated catch blocke.printStackTrace();}}//打印所有节点名称publicvoid listAllNodeName(){listElements(getRootNode());}//打印node的所有子节点名称publicvoid listElements(Node node){//打印快捷方法 shift+home/end, alt+/ 向上的方向键if(Node.ELEMENT_NODE==node.getNodeType()){System.out.println(node.getNodeName());NodeList nl=node.getChildNodes();for(int i =0; i <nl.getLength(); i++){Node n=nl.item(i);listElements(n);}}}/* * 得到xml文档所表示的集合 */publicList<Person> getPersonList(){List<Person> lsp=null;try{NodeList nodeList = document.getElementsByTagName("person");if(nodeList.getLength()>0){lsp=newArrayList<Person>();for(int i =0; i <nodeList.getLength(); i++){Node item = nodeList.item(i);NodeList childNodes = item.getChildNodes();Person p=newPerson();for(int j =0; j <childNodes.getLength(); j++){Node item2 = childNodes.item(j);String nodeName=item2.getNodeName();if("id".equals(nodeName)){p.setId(Integer.parseInt(item2.getTextContent()));}elseif("name".equals(nodeName)){p.setName(item2.getTextContent());}elseif("age".equals(nodeName)){p.setId(Integer.parseInt(item2.getTextContent()));}}lsp.add(p);}}}catch(Exception e){e.printStackTrace();}return lsp;}}</span>


0 0