XML笔记
发布时间:2020-12-16 09:19:03 所属栏目:百科 来源:网络整理
导读:1.Xml 的介绍 : xml 技术用于解决什么问题 ? Xml---eXtensibleMarkupLanguage 的缩写 , 可扩展的标记语言 .--------- 是 w3c 组织制定的 . XML 被设计用来传输和存储数据 XML 标签没有被预定义,需要用户自行定义标签。 XML 技术是 W3C 组织 (WorldWideWebCo
1.Xml的介绍:
xml技术用于解决什么问题?
Xml---eXtensibleMarkupLanguage的缩写,可扩展的标记语言.---------是w3c组织制定的.
XML被设计用来传输和存储数据
XML标签没有被预定义,需要用户自行定义标签。
XML技术是W3C组织(WorldWideWebConsortium万维网联盟)发布的,目前遵循的是W3C组织于2000年发布的XML1.0规范。
XML被广泛认为是继Java之后在Internet上最激动人心的新技术。
实际上就是类似于html的,但是很多的标签都是自定义的
xml语言用于描述类似上面的有关系的数据
它允许用户自定义标签,一个标签用于描述一段数据,一个标签可以分为开始标签和结束标签在开始标签和结束标签之间又可以使用其它标签描述其它的数据,以此来实现数据关系描述,例如:
通过解析器将xml解析出来
xml是一种通用的数据交换格式,通常用于交换数据和保存程序的配制信息
使用xml还是properties?
如果配置文件中的数据是有关系的,那么就用xml,否则就用properties文件.
2.Xml的语法(了解):Xml语法实际上就是告诉你如何去写一个xml文件不报错.
2.1.文档声明:
<?xmlversion=“1.0”?>文档声明必须要出现在xml文件的第一行.一般情况下xml文件的扩展名就是.xml,但是不仅仅局限于.xml扩展名
Xml文件中声明了xml文件的编码格式.
注意:如果出现乱码的问题,要检查保存的编码和解析时的编码是否一致。
2.2.Xml的元素:
Xml元素就是咱们所了解的标签,一般情况下别人在说道html的元素或者xml的元素的时候,就指的是标签.
在写xml的元素的时候,不要嵌套.
一个XML文档必须有且仅有一个根标签,其他标签都是这个根标签的子标签或孙标签。
对于标签中出现的所有空格和换行,解析程序都会当作标签内容进行处理,例如:
与:
的意义是不一样的。由于空格和换行都会作为原始内容处理,所以,在编写xml时可以去除多余的空格和换行来减少干扰,提高解析速度。
l命名规范: 一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:
区分大小写,例如,<P>和<p>是两个不同的标记。
不能以数字或"_"(下划线)开头。
不能以xml(或XML、或Xml等)开头。
不能包含空格。
名称中间不能包含冒号(:)(有特殊用途)。
属性都是某个元素的,在html中,每个标签会有一些特定的属性,那么在定义xml的元素时,也是可以添加一些属性的.命名规范与
刚刚的元素的命令规范是一样的.
Xml的属性的值必须要使用“”或这 ‘’引起来.
在XML技术中,标签属性所代表的信息,如果没有标签体,也可以被改成用子元素的形式来描述,例如:
Xml的注释与html的注释是一样的.
同样的,注释不要嵌套就好了.
Characterdataarea----字符数据区,通常有些文本内容不想当多xml的标签内容去处理,那么这个时候就可以使用cdata区来描述了.
作用:把标签当做普通文本内容;
语法:<![CDATA[内容]]>
Greatthan:大于
lessthan:小于
Apostrophe:单引号
ampersand:and符号
quotation:双引号
PI-----processinginstruction---处理指令
作用:用来指挥软件如何解析XML文档。
语法:必须以“<?”作为开头,以“?>”作为结尾。
常用处理指令:
XML声明:<?xmlversion=“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(DocumentTypeDefinition),全称为文档类型定义。
Dtd文件的内容:
<!ELEMENTpersonListANY>
<!ELEMENTperson(id,name,age)>
<!ELEMENTid(#PCDATA)>
<!ELEMENTname(#PCDATA)>
<!ELEMENTage(#PCDATA)>
对于编写xml,如果要进行校验,那么可以使用工具 MyEclipse的Run Validation菜单手动去校验.
如果没有自动校验,可以手动的去运行校验一下.
可以在xml文件中使用命令来引入外部的dtd文件,也可以直接将dtd的内容就写在xml文件内部.
在内部直接写
引入外部的文件:
第一种:dtd文件在本地
包括的各个部分的意思:
DOCTYPE:表示引入dtd文件,是固定的
Html:根标签的名字,是html
PUBLIC:是互联网上的一个公共的dtd文件
"-//W3C//DTDHTML4.01Transitional//EN":dtd在互联网上的名称
"http://www.w3.org/TR/html4/loose.dtd":dtd的路径
属性定义:
Attribute----
在定义属性的时,设置的说明部分是有一些固定的值的.
举例:
<!ATTLIST页面作者
姓名CDATA#IMPLIED
年龄CDATA#IMPLIED
联系信息CDATA#REQUIRED
网站职务CDATA#FIXED"页面作者"
个人爱好CDATA"上网">
在定义属性的时,属性值部分是有一些固定的值的.
CDATA:表示属性值为普通文本字符串。
ENUMERATED:枚举,提供的若干的值中的一个
IDidentity: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
ldom解析器:
Html的时候学了htmldom(documentobjectmodel),那么在这里的xml的dom解析器也叫做xmldom(文档对象模型)
Dom---文档对象模型,现在将xmldom-----现在的文档就是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); } //保存xml publicvoid save2Xml(Document document,String tarXml){ try{ Transformer transformer =TransformerFactory.newInstance().newTransformer(); transformer.transform(newDOMSource(document),newStreamResult(tarXml)); }catch(Exception e){ // TODO Auto-generated catch block e.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> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |