XML基础+Java解析XML.docx
- 文档编号:24089959
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:22
- 大小:26.75KB
XML基础+Java解析XML.docx
《XML基础+Java解析XML.docx》由会员分享,可在线阅读,更多相关《XML基础+Java解析XML.docx(22页珍藏版)》请在冰豆网上搜索。
XML基础+Java解析XML
XML是什么
可扩展的标记语言
XML能干什么
描述数据、存储数据、传输(交换)数据。
XML有什么
∙元素
∙属性
∙实体
∙PCDATA:
被解析的字符数据(parsedcharacterdata),PDATA是会被解析器解析的文本。
这些文本将被解析器检查实体以及标记
∙CDATA:
字符数据(characterdata),CDATA是不会被解析器解析的文本
XML与HTML区别:
目的不一样
XML被设计用来描述数据,其焦点是数据的内容。
HTML被设计用来展示数据,其焦点是数据的外观。
HTML可以不关闭标签(即标签可以不成对出现),但XML必须关闭标签(即标签必须成对出现)。
HTML中的标签标识文本如何展示,而XML中的标签标识文本是什么含义(什么类型的文本)。
XML注意
XML是无作为的,不会做任何事情,只用于描述数据、存储数据、传输(交换)数据。
如何展示和使用XML数据就需要程序员根据需求来做解析数据并展示和使用。
XML文档节点类型
u文档(document)
u元素(element)
u属性(attribute)
u文本(PCDATA--parsedcharacterdata)
u注释(comment)
uDOCTYPE:
主要验证文档内容的正确性
u实体(ENTITIES)
uCDATA(characterdata)
XML语法
1、声明:
xmlversion="1.0"encoding="UTF-8"?
>
2、根节点:
必须有一个根节点
3、标签:
标签必须有结束且区分大小写,标签必须顺序嵌套
4、属性:
必须引号引起值
5、空格会被保留,HTML空格最多保留一个
6、命名规则:
命名必须见名知意
a)名字可包含字母、数字以及其他的字符
b)名字不能以数字或者标点符号开始
c)名字不能以字符“xml”(或者XML、Xml)开始
7、名字不能包含空格
8、不应在XML元素名称中使用":
",这是由于它用于命名空间(namespaces)的保留字。
9、标签优先于属性。
10、XML命名空间可提供避免元素命名冲突的方法。
11、CDATA:
字符数据,
[CDATA[字符数据]]>,字符数据不进行转义
12、实体:
&实体;
DTD
是什么
DTD(DocTypeDefinition文档类型定义)的作用是定义XML文档的合法构建模块。
它使用一系列的合法元素来定义文档结构。
能干什么
DTD(文档类型定义)的作用是约定XML格式。
主要有什么
元素、属性、实体定义
DTD引用方式
内部
DOCTYPE根元素[元素声明]>
外部私有的SYSTEM一般是我们自己定义的,可能只是一个公司内部使用
DOCTYPE根元素SYSTEM"dtd文件位置">
外部公有的PUBLIC一般是一些标准,可能非常多的人用
DOCTYPE根元素PUBLIC"命名空间""dtd文件位置">
首先根据“命名空间”去问环境要相应的dtd文件,如果有,直接提供,如果没有再根据dtd文件位置找。
格式
ELEMENT>描述元素之间关系
定义
ELEMENT元素名称(元素内容)>
顺序:
(seq1,se2)必须按顺序
(or1|or2)两个选一个
个数:
?
零个或一个
标签必须一个
*零个或多个
+一个或多个
ATTRLIST>描述元素属性
格式:
ATTLIST元素名称属性名称属性类型默认值>
属性类型:
CDATA
值为字符数据(characterdata)
(en1|en2|..)
此值是枚举列表中的一个值
ID
值为唯一的id
IDREF
值为另外一个元素的id
IDREFS
值为其他id的列表
NMTOKEN
值为合法的XML名称
NMTOKENS
值为合法的XML名称的列表
ENTITY
值是一个实体
ENTITIES
值是一个实体列表
#PCDATA
定义文本元素,没有子元素
默认值:
值
解释
值
属性的默认值
#REQUIRED
属性值是必需的
#IMPLIED
属性不是必需的
#FIXEDvalue
属性值是固定的
实体:
ENTITY实体名称"实体的值">
Schema
是什么
XMLSchema是基于XML的DTD替代者。
XMLSchema描述XML文档的结构。
XMLSchema语言也称作XMLSchema定义(XMLSchemaDefinition,XSD)。
DTD不是通过XML语法定义文档结构,不能定义数据类型和限制
Schema通过XML语法定义文档结构,可以定义数据类型和限制
能干什么
约定XML格式
∙定义可出现在文档中的元素
∙定义可出现在文档中的属性
∙定义哪个元素是子元素
∙定义子元素的次序
∙定义子元素的数目
∙定义元素是否为空,或者是否可包含文本
∙定义元素和属性的数据类型
∙定义元素和属性的默认值以及固定值
为何使用Schema?
XMLSchema是DTD的继任者
我们认为XMLSchema很快会在大部分网络应用程序中取代DTD。
理由如下:
∙XMLSchema可针对未来的需求进行扩展
∙XMLSchema更完善,功能更强大
∙XMLSchema基于XML编写
∙XMLSchema支持数据类型和限制
∙XMLSchema支持命名空间
有什么
元素、属性、限定的定义。
可以约束我们写XML文件。
Schema引用方式
xmlns: xsi="http: //www.w3.org/2001/XMLSchema-instance" xsi: schemaLocation="命名空间Schema位置"> 如何找Schema,和DTD一样,首先根据命名空间问环境要,找不到再根据Schema位置找。 Java解析XML 推模型和拉模型 推模型是当通知消息来之时,把所有相关信息都通过参数的形式“推给”观察者。 事件驱动编程(Event-drivenprogramming),基于回调(callback)机制,也就是推模型,即使不需要也把数据推给你。 拉模型是当通知消息来之时,通知的函数不带任何相关的信息,而是要观察者主动去“拉”信息。 通过轮询(Loopcheck)实现就是拉模型,,给你一个引用,数据在拉之前全部准备好了,需要时拉需要。 JAXP DOM解析 DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。 DOM是以层次结构组织的节点或信息片断的集合。 这个层次结构允许开发人员在树中寻找特定信息。 分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。 由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。 DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。 DOM是拉模型,在遍历文档时,会把感兴趣的部分从读取器中拉出,不需要引发事件,允许我们选择性地处理节点。 这大大提高了灵活性,以及整体效率。 java代码: 查看复制到剪贴板打印 1.publicstaticvoiddomParse()throwsException{ 2.Filefile= 3.newFile("F: /javass/web项目/workspace/xml/src/users.xml"); 4.//1、创建DocumentBuilder工厂 5.DocumentBuilderFactorydbf= 6.DocumentBuilderFactory.newInstance(); 7.//2、创建DocumentBuilder 8.DocumentBuilderdb=dbf.newDocumentBuilder(); 9.//3、将xml文件解析为Document对象,代表DOM树 10.Documentdocument=db.parse(file); 11.//将文档标准化,去除无用的空格和空行,即删除无用的textnode 12.document.normalize(); 13.NodeListnodeList=document.getElementsByTagName("user"); 14.for(inti=0;i 15. 16.Elementelement=(Element)nodeList.item(i); 17.System.out.println("======userstart======="); 18.Stringuuid=element.getElementsByTagName("uuid").item(0).getTextContent(); 19.System.out.println(uuid); 20.Stringname=element.getElementsByTagName("name").item(0).getTextContent(); 21.System.out.println(name); 22.System.out.println("======userend======="); 23.} 24.} publicstaticvoiddomParse()throwsException{ Filefile= newFile("F: /javass/web项目/workspace/xml/src/users.xml"); //1、创建DocumentBuilder工厂 DocumentBuilderFactorydbf= DocumentBuilderFactory.newInstance(); //2、创建DocumentBuilder DocumentBuilderdb=dbf.newDocumentBuilder(); //3、将xml文件解析为Document对象,代表DOM树 Documentdocument=db.parse(file); //将文档标准化,去除无用的空格和空行,即删除无用的textnode document.normalize(); NodeListnodeList=document.getElementsByTagName("user"); for(inti=0;i Elementelement=(Element)nodeList.item(i); System.out.println("======userstart======="); Stringuuid=element.getElementsByTagName("uuid").item(0).getTextContent(); System.out.println(uuid); Stringname=element.getElementsByTagName("name").item(0).getTextContent(); System.out.println(name); System.out.println("======userend======="); } } DOM的基本对象有5个: Document,Node,NodeList,Element和Attr。 1.1、Document对象 代表了整个XML的文档,所有其它的Node,都以一定的顺序包含在Document对象之内,排列成一个树形的结构,程序员可以通过遍历这颗树来得到XML文档的所有的内容,这也是对XML文档操作的起点。 我们总是先通过解析XML源文件而得到一个Document对象,然后再来执行后续的操作。 此外,Document还包含了创建其它节点的方法,比如createAttribut()用来创建一个Attr对象。 它所包含的主要的方法有: createAttribute(String): 用给定的属性名创建一个Attr对象,并可在其后使用setAttributeNode方法来放置在某一个Element对象上面。 createElement(String): 用给定的标签名创建一个Element对象,代表XML文档中的一个标签,然后就可以在这个Element对象上添加属性或进行其它的操作。 createTextNode(String): 用给定的字符串创建一个Text对象,Text对象代表了标签或者属性中所包含的纯文本字符串。 如果在一个标签内没有其它的标签,那么标签内的文本所代表的Text对象是这个Element对象的唯一子对象。 getElementsByTagName(String): 返回一个NodeList对象,它包含了所有给定标签名字的标签。 getDocumentElement(): 返回一个代表这个DOM树的根节点的Element对象,也就是代表XML文档根元素的那个对象。 1.2、Node对象 是DOM结构中最为基本的对象,代表了文档树中的一个抽象的节点。 在实际使用的时候,很少会真正的用到Node这个对象,而是用到诸如Element、Attr、Text等Node对象的子对象来操作文档。 Node对象为这些对象提供了一个抽象的、公共的根。 虽然在Node对象中定义了对其子节点进行存取的方法,但是有一些Node子对象,比如Text对象,它并不存在子节点,这一点是要注意的。 Node对象所包含的主要的方法有: appendChild(org.w3c.dom.Node): 为这个节点添加一个子节点,并放在所有子节点的最后,如果这个子节点已经存在,则先把它删掉再添加进去。 getFirstChild(): 如果节点存在子节点,则返回第一个子节点,对等的,还有getLastChild()方法返回最后一个子节点。 getNextSibling(): 返回在DOM树中这个节点的下一个兄弟节点,对等的,还有getPreviousSibling()方法返回其前一个兄弟节点。 getNodeName(): 根据节点的类型返回节点的名称。 getNodeType(): 返回节点的类型。 getNodeValue(): 返回节点的值。 hasChildNodes(): 判断是不是存在有子节点。 hasAttributes(): 判断这个节点是否存在有属性。 getOwnerDocument(): 返回节点所处的Document对象。 insertBefore(org.w3c.dom.Nodenew,org.w3c.dom.Noderef): 在给定的一个子对象前再插入一个子对象。 removeChild(org.w3c.dom.Node): 删除给定的子节点对象。 replaceChild(org.w3c.dom.Nodenew,org.w3c.dom.Nodeold): 用一个新的Node对象代替给定的子节点对象。 1.3、NodeList对象 顾名思义,就是代表了一个包含了一个或者多个Node的列表。 可以简单的把它看成一个Node的数组,我们可以通过方法来获得列表中的元素: getLength(): 返回列表的长度。 item(int): 返回指定位置的Node对象。 1.4、Element对象 代表的是XML文档中的标签元素,继承于Node,亦是Node的最主要的子对象。 在标签中可以包含有属性,因而Element对象中有存取其属性的方法,而任何Node中定义的方法,也可以用在Element对象上面。 getElementsByTagName(String): 返回一个NodeList对象,它包含了在这个标签中其下的子孙节点中具有给定标签名字的标签。 getTagName(): 返回一个代表这个标签名字的字符串。 getAttribute(String): 返回标签中给定属性名称的属性的值。 在这儿需要主要的是,应为XML文档中允许有实体属性出现,而这个方法对这些实体属性并不适用。 这时候需要用到getAttributeNodes()方法来得到一个Attr对象来进行进一步的操作。 getAttributeNode(String): 返回一个代表给定属性名称的Attr对象。 1.5、Attr对象 代表了某个标签中的属性。 Attr继承于Node,但是因为Attr实际上是包含在Element中的,它并不能被看作是Element的子对象,因而在DOM中Attr并不是DOM树的一部分,所以Node中的getParentNode(),getPreviousSibling()和getNextSibling()返回的都将是null。 也就是说,Attr其实是被看作包含它的Element对象的一部分,它并不作为DOM树中单独的一个节点出现。 这一点在使用的时候要同其它的Node子对象相区别。 SAX解析 SAX是SimpleAPIforXML的缩写,它并不是由W3C官方所提出的标准,可以说是“民间”的事实标准。 实际上,它是一种社区性质的讨论产物。 虽然如此,在XML中对SAX的应用丝毫不比DOM少,几乎所有的XML解析器都会支持它。 与DOM比较而言,SAX是一种轻量型的方法。 我们知道,在处理DOM的时候,我们需要读入整个的XML文档,然后在内存中创建DOM树,生成DOM树上的每个Node对象。 当文档比较小的时候,这不会造成什么问题,但是一旦文档大起来,处理DOM就会变得相当费时费力。 特别是其对于内存的需求,也将是成倍的增长,以至于在某些应用中使用DOM是一件很不划算的事(比如在applet中)。 这时候,一个较好的替代解决方法就是SAX。 SAX在概念上与DOM完全不同。 首先,不同于DOM的文档驱动,它是事件驱动的,也就是说,它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。 所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。 (如果你对Java新的代理事件模型比较清楚的话,就会很容易理解这种机制了) 回调: 由我们在组件中定义,而不由我们调用,由容器或框架调用 SAX是推模型,它是一种靠事件驱动的模型。 当它每发现一个节点就引发一个事件,而我们需要编写这些事件的处理程序。 这样的做法很麻烦,且不灵活。 java代码: 查看复制到剪贴板打印 1.importorg.xml.sax.Attributes; 2.importorg.xml.sax.SAXException; 3.importorg.xml.sax.helpers.DefaultHandler; 4.publicclassUserSaxHandlerextendsDefaultHandler{ 5. 6.booleanisOkTag=false; 7. 8.@Override 9.publicvoidstartElement(Stringuri,StringlocalName,StringqName, 10.Attributesattributes)throwsSAXException{ 11.if(qName.equals("user")){ 12.System.out.println("=============userstart============"); 13.} 14. 15.if(qName.equals("uuid")||qName.equals("name")){ 16.isOkTag=true; 17.System.out.print(qName+": "); 18.} 19.} 20. 21.@Override 22.publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException{ 23.if(isOkTag){ 24.System.out.println(newString(ch,start,length)); 25.} 26.} 27. 28.@Override 29.publicvoidendElement(Stringuri,StringlocalName,StringqName) 30.throwsSAXException{ 31.isOkTag=false; 32.if(qName.equals("user")){ 33.System.out.println("=============userend============"); 34.} 35.} 36.} importorg.xml.sax.Attributes; importorg.xml.sax.SAXException; importorg.xml.sax.helpers.DefaultHandler; publicclassUserSaxHandlerextendsDefaultHandler{ booleanisOkTag=false; @Override publicvoidstartElement(Stringuri,StringlocalName,StringqName, Attributesattributes)throwsSAXException{ if(qName.equals("user")){ System.out.println("=============userstart============"); } if(qName.equals("uuid")||qName.equals("name")){ isOkTag=true; System.out.print(qName+": "); } } @Override publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException{ if(isOkTag){ System.out.println(newString(ch,start,length)); } } @Override publicvoidendElement(Stringuri,StringlocalName,StringqName) throwsSAXException{ isOkT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- XML 基础 Java 解析
![提示](https://static.bdocx.com/images/bang_tan.gif)