java语言程序设计java_xml_第1页
java语言程序设计java_xml_第2页
java语言程序设计java_xml_第3页
java语言程序设计java_xml_第4页
java语言程序设计java_xml_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、XML基础Xml 的数据传输XML文档 显示服务DTD样式表处理程序XML 解析器解析树呈现程序XMLo XML 即可扩展标记语言(Extensible Markup Language),是一种平台无关的表示数据的方法。简单地说,使用 XML 创建的数据可以被任何应用程序在任台上读取。甚至可以通过手动编码来编辑和创建XML 文档。其原因是,XML 与 HTML 一样,都是建立在相同的基于标记技术基础之上。o XML(Extensible Markup Language)是一种可扩展的置标语言。o XML来源于SGML(标准通用置标语言), 但XML是它的简化,但保留了其精华。W3C于1998年

2、2月批准了XML的1.0版本。成为一个国际标准。置标指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。XMl的特点 XML 文档是一个自我描述的数据集合 XML 的优点 自我描述性 可移植性 以树结构描述数据 提供可用于数据库的功能 XML 的缺点 数据存取慢 缺少数据库的功能 在生产环境中将失效文档格式定义 DTDXML 的优点在于它允许您定义自己的有意义的标记,因此您可以最大程度地定制文档。但 XML 就是 XML(可扩展),而人就是人(疯狂的人),这可能很快就会无法控制。解决方案是 DTD,它指定了 XML 文档的标记。简而言之,DTD 指定:可以在文档中

3、存在的元素、那些元素可以具有的属性、在元素内部元素的层次结构以及元素在整个文档中出现的顺序。目的:确保文档有效DTD(Document Type Definition,文档格式定义)。对于想利用XML文件来交换信息的实体来说,他们之间必须有一个约定即编写XML文件可以用哪些标记,母元素中能够包括哪些子元素,各个元素出现的顺序,元素中的属性怎样定义等。这样他们在用XML交换数据时才能够畅通无阻,这种约定称为DTD。可以把DTD看作编写XML文件的模板。对于同行业之间的XML数据交换,有一个固定的DTD将会方便很多。比如说, 如果网上的各大电子商场的XML网页都遵循同一个DTD时,那么我们就可以轻

4、松地依据这个DTD 编写一个应用程序,去网上将我们感兴趣的东西自动抓回来。o格式正确的 XML 文档是满足以下三个基本结构需求的文档:o 有一个包含所有其它元素的父(或根)元素o 每个开始标记都有结束标记o 所有元素都正确嵌套的oooopDTD 的第一行定义了 XML 文档的父元素: person 。person 元素有两个子元素: firstname 和 lastname 。第二和第三行包含了元素属性 #PCDATA ,它表明 firstname 和lastname 元素可能包含经过语法分析的字符数据(在这种情况下是文本)。DTD 文件的最后一行描述了一个空标记: nothing 。pp从3

5、 中的 DTD 可以看出,任何阅读我们的 XML 文档的人(以及对它进行语法分析的语法分析器)都知道 person 元素仅包含两个文本元素: firstname 和 lastname 。此外,DTD 规定,在整个文档中, firstname 元素必须在 lastname 元素之前出现。o oJaneFungoo DTD 中的内容虽然 DTD 不是必需的,但它们确实带来方便。DTD 适合三个基本用途。它能:o 对标记编制文档o 加强标记参数内部的一致性o 使 XML 语法分析器能够确认文档o 如果不对 XML 文档进行 DTD 定义,文档就无法由 XML 语法解析器进行确认。解析器 XML解析读

6、取XML文档并将文档分解为可进行分析的几个元素的过程处理 XML 文档 解析器检查 XML 文档的有效性和格式规范 创建解析树并将其传递给呈现程序 呈现程序将显示此解析树 解析器将创建一系列对象,用于显示与 XML 文档关联的样式表解析器概述1.DOM2.SAX3.JDOM4.DOM4J文档对象模型 dom基于树和节点的文档对象模型(Document Object Module)称为DOM,DOM 采用建立树形结构的方式访问。DOM 解析器把 XML 文档转化为一个包含其内容的树,并可以对树进行遍历。用 DOM 解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigatio

7、n APIs 访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用 DOM 解析器的时候需要处理整个 XML 文档,所以对性能和内存的要求比较高,尤其是遇到很大的 XML 文件的时候。由于它的遍历能力,DOM 解析器常用于XML文档需要频繁的改变的服务中。o1。W3C制定的一套跨平台和语言标准,表示文档的内容和模型2。用Level(级别)的形式代替版本。Level1定义了文档中内容的功能查找方evel2提供了对XML,HTML和CSS等内容模型的模块选项。Level3制定中,为特定类型提供更多的工具如XML的验证公交等3。基于对象的将 XML 文档表示为树4。在内存中解析

8、和存储 XML 文档5。允许随机访问文档的不同部分6。DOM解析器把XML文档转化为一个包含其内容的树, 并可以对树进行遍历文档对象模型采用的模式树模式 树模型 每个项目都表示一个节点 每个终端项目都表示一个叶节点 直接上级节点表示父节点 任何上级节点都表示祖先节点 从树的一个部分可以到达树的任何其他部分请看下列“department.xml”XML 文档:约瑟夫玛丽DOM 中“department.xml”的结构如下:DepartmentStudentE-mail: StudentName: 玛丽 E-mail:mar

9、 Name: 约瑟夫DOM解析函数o 得到文档模型的根元素n Element root = doc.getDocumentElement();o 元素Element的函数:n String getTagName()n String getAttribute(“unit”)o 节点Node的函数:-得到标签的名字-得到元素的unit属性值n NodeListgetChildNodes()- 得到子节点的集合n Node getFirstChild()n Node getLastChild()- 得到第一个子节点- 得到最后一个子节点DOM解析函数节点Node的函数:n Nod

10、e getNextSibling() - 得到下一个兄弟节点n Node getPreviousSibling()- 得到前一个兄弟结点on Node getParentNode()- 得到父节点n NamedNodeMap getAttributes()- 得到所有的属性集合n String getNodeName()n String getNodeValue()NodeList的函数n int getLength()n Node item(int index)- 得到当前节点的名字- 得到当前节点的值o-得到集合长度- 得到集合中的一个元素使用 DOM 解析 XML 文档要将 XML 文档

11、读入 DOM,请执行下列步骤: 获得一个新 DocumentBuilderFactory 实例 使用 DocumentBuilderFactory 构建 DocumentBuilder 使用 DocumentBuilder 中的 parse( ) 方法解析给定的文件 将已解析的文档存储在 Document 对象中 使用 getElementsByTagName( ) 方法从文档获得元素使用 DOM 解析 XML 文档 DOM 文档是使用 Transformer 类写入输出结果采用两个参数,即 DOMSource 和 StreamResult DOMSource 对象以 DOM 树形式来保存源树

12、。StreamResult 对象保存转换结果 将 XML 数据写入输出结果的步骤如下: 创建文档对象 创建 TransformerFactory 程序的一个实例 使用 TransformerFactory 创建 Transformer 类的一个实例 使用 Transform 方法将源树处理至输出结果中写XML文档函数o DocumentBuilder 的函数:n Document doc = builder.newDocument(); -新建一个模型o Document 的函数:n Element createElement(String name) 建立一个元素n Text createT

13、extNode(String data)-创建一个文本节点o Node的函数:n Node appendChild(Node child)- 添加一个子节点o Element 的函数:n void setAttribute(String name, String value)- 设置元素的一个属性和属性值DOM解析演示o MyXMLReader.javao MyXMLWriter.java DOM 最适用的情形 在结构上修改 XML 文档时 在内存中与其他应用程序共享文档时 DOM 的缺点 将整个文档存储在内存中 方法命名惯例不符合 Java 编程惯例SAX的XML简单API(Simple A

14、PI for XML)o基于称为SAX,SAX 采用的模型。SAX 解析器在解析XML文档的时候可以触发一系列的,当发现给定的tag的时候,它可以激活一个回调方法, 告诉该方法制定的标签已经找到。SAX 对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现。但用 SAX 解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。1。SAX(Simple API for XML )基于驱动, 使用回调机制将重要给客户端应用程序2。SAX 的结构 简单 SAX 应用程序的组件

15、包括: 应用程序创建一个解析器和一个文档处理程序告诉解析器使用哪个文档处理程序告诉解析器处理文档 解析器 将重要 文档处理程序 处理给文档处理程序简单 SAX 的组件应用程序 new DocumentHanlder () new Parser()startDocument解析器文档处理程序Parse() startElement characters endElement endDocument new Document Hanlder () 用于 XML 解析的 Java API 可使用 SAX 的普通 API 作为 javax.xml 包实现 易于安装且快速 更具一致性 使用 Factor

16、y 设计模式创建要解析的对象 SAXParser 类中可用的方法如下:SAXParser 方法说明getParser()返回 SAX org.xml.sax.Parser 对象。getProperty()返回指定属性的值。setProperty()设置指定值的属性。getXMLReader()返回 SAX org.xml.sax.XMLReader 对象。isNamespaceAware()指明是否配置解析器以了解名字空间。isValidating()指明是否配置解析器以验证 XML 文档。SAXParserHandler 类 解释如何捕获和响应各个 startDocument( ) 和 en

17、dDocument( )激发的 startElement( ) 和 endElement( )激发的是在文档的起始处和结束处被是在遇到起始标记和结束标记时被 characters( )是在遇到字符数据时被激发的使用SAX 解析 XML 文档的步骤如下: 创建 SAXParserFactory 的实例 创建 SAXParser 的实例 创建 SAXParserHandler 类 使用 parse() 方法解析 XML 文档SAX解析演示o SaxXMLReader.java演示 SAX 最适用的情形 在需要解析大型文档时 在只需一个信息子集时 SAX 的缺点不能对文档进行随机访问只读只遍历文档一

18、次JDOMp JDOM:Jason Hunter 和 Brett McLaughlin开发的项目,JDOM的设计目标就是在读和创建XML时简化DOM,取代DOM。p 微软的MSXML解析器:微软已经给我们提供了一个XML语法解析器,即一个叫做MSXML.DLL的动态链接库(C语言)jdom包的结构包括:org.jdom包含了所有的xml文档要素的java类org.jdom.adapters org.jdom.filter org.jdom.input包含了与dom适配的java类包含了xml文档的过滤器类包含了读取xml文档的类包含了写入xml文档的类包含了将jdom xml文档接口转换为其o

19、rg.jdom.output org.jdom.transform 他xml文档接口org.jdom.xpath包含了对xml文档xpath操作的类DOM4JoDOM4J:一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台, 采用了Java集合框架并完全支持DOM, SAX和JAXP。DOM4J包的结构包括:AttributeAttribute定义了XML的属性Branch为能够包含子节点的节点如XML元素(Element)和文Branch档(Docuemnts)定义了一个公共的行为CDATACDATA 定义了XML CDATA 区域CharacterDataChar

20、acterData是一个标识借口,标识基于字符的节点。如CDATA,Comment, Text.CommentComment 定义了XML注释的行为Document定义了XML文档DocumentTypeDocumentType 定义XML DOCTYPE声明ElementElement定义XML 元素ElementHandlerElementHandler定义了 Element 对象的处理器ElementPath被 ElementHandler 使用,用于取得当前正在处理的路径层次信息EntityEntity定义 XML entityDOM4J包的结构包括:NodeNode为所有的dom4j

21、中XML节点定义了多态行为NodeFilterNodeFilter 定义了在dom4j节点中产生的一个滤镜或谓词的行为(predicate)ProcessingInstructionProcessingInstruction 定义 XML 处理指令.Text定义XML 文本节点.VisitorVisitor 用于实现Visitor模式.XPathXPath 在分析一个字符串后会提供一个XPath 表达式 读取并解析XML文档:读写XML文档主要依赖于org.dom4j.io包,其中提供DOMReader和SAXReader两类不同方式,而调用方式是一样的。这就是依靠接口的好处。/ 从文件读取X

22、ML,输入文件名,返回XML文档public Document read(String fileName) throws MalformedURLException,DocumentException SAXReader reader = new SAXReader();Document document = reader.read(new File(fileName); return document; 取得Root节点public Element getRootElement(Document doc)return doc.getRootElement(); 遍历XML树DOM4J提供至少

23、3种遍历节点的方法:1) 枚举(Iterator)/ 枚举所有子节点for ( Iterator i = root.elementIterator(); i.hasNext(); ) Element element = (Element) i.next();/ do something/ 枚举名称为foo的节点for ( Iterator i = root.elementIterator(foo); i.hasNext();) Element foo = (Element) i.next();/ do something/ 枚举属性for ( Iterator i = root.attribu

24、teIterator(); i.hasNext(); ) Attribute attribute = (Attribute) i.next();/ do something 遍历XML树2)递归递归也可以采用Iterator作为枚举手段,但文档中提供了另外的做法public void treeWalk() treeWalk(getRootElement();public void treeWalk(Element element) for (int i = 0, size = element.nodeCount(); i size; i+) Node node = element.node(i

25、);if (node instanceof Element) treeWalk(Element) node); else / do something. 遍历XML树3) Visitor模式了解设计模式的人都知道,Visitor是GOF设计模式之一。其主要原理就是两种类互相保有对方的引用,并且一种作为Visitor去访问许多Visitable。 我们来看DOM4J中的Visitor模式(快速文档中没有提供)只需要自定一个类实现Visitor接口即可。public class MyVisitor extends VisitorSupport public void visit(Element e

26、lement) System.out.println(element.getName();public void visit(Attribute attr) System.out.println(attr.getName();调用: root.accept(new MyVisitor()注意,这个Visitor是自动遍历所有子节点的。如果是 root.accept(MyVisitor),将遍历子节点。我第一次用的时候,认为是需 要自己遍历,便在递归中调用Visitor,结果可想而知。4. 创建XMLpublic Document createDocument() Document docume

27、nt = DocumentHelper.createDocument(); Element root = document.addElement(root);Element author1 =root.addElement(author).addAttribute(name, James).addAttribute(location, UK).addText(James Strachan);Element author2 =root.addElement(author).addAttribute(name, Bob).addAttribute(location, US).addText(Bob

28、 McWhirter); return document;5. 文件输出一个简单的输出方法是将一个Document或任何的Node通过write方法输出FileWriter out = new FileWriter( foo.xml );document.write(out);美化输出或缩减格式,可以用XMLWriter类public void write(Document document) throws IOException XMLWriter writer = new XMLWriter(new FileWriter( output.xml );writer.write( document );writer.close();/ 美化格式OutputFormat format = OutputF

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论