您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业财务 > 第十四章XML和FileIO
XML和FileI/O1.XML定义:XML(ExtensibleMarkupLanguage)可扩展性标记语言,它是一种简单的数据存储语言。2.使用XML的作用:支持自定义标签,具有扩展性,可以持久化存储数据,对数据进行交换,数据配置(可读性强、灵活性高)。3.定义XML语法:a)XML文档总是以XML声明开始,它定义了XML的版本和所使用的编码等信息。该声明以”?”开始,紧跟”xml”字符串,以”?”结束。例:?xmlversion=”1.0”encoding=”UTF-8”?b)XML的主要部分是元素,元素由开始标签,元素内容和结束标签组成。元素内容可以包含子元素,字符数据等。(自定义标签)c)XML文档中的注视符号是!----4.XML和XHTML的区别:4.1XHTML中标签都有固定含义,不能去创造标签。而XML支持自定义标签,具有扩展性。4.2XHTML主要用来显示数据,可以通过标签和属性对页面进行排版,而XML用来存储和交换数据,无法描述页面的排版和显示形式。5.XML结构的定义:定义XML结构有两种形势:DTD和XSD。5.1DTD的作用:DTD可以更好的约束XML文件的编码规范。5.2DTD可以定义在XML文档中,也可以作为一个外部文件存在,作用于所有导入它的XML文档。5.2.1定义在XML文档中的语法:!DOCTYPE根元素【元素声明】?xmlversion=”1.0”encoding=”UTF-8”?!--使用内部DTD文件--!DOCTYPEpets[//根元素是pets!ELEMENTpets(dogs,penguins)//pets直接下级元素是dogs,penguins,顺序固定,只能出现一次!ELEMENTdogs(dog*)//dogs的直接下级元素是dog,*表示dog元素可以出现0到多次(大于等于0)!ELEMENTpenguins(penguin+)//penguins的直接下级元素是penguin,+表示penguin元素至少要出现一次(大于等于1)!ELEMENTdog(name,health,love,strain?)//dog的直接下级元素依次是name,health,love,strain,?表示strain元素出现0到1次!ATTLISTdogidCADTA#REQUIRED//ATTLIST表示属性集合,dog元素有id属性,是CDATA类型,必须出现!ELEMENTname(#PCDATA)!ELEMENThealth(#PCDATA)//#PCDATA表示name元素为”PCDATA”类型!ELEMENTlove(#PCDATA)!ELEMENTstrain(#PCDATA)]5.2.2定义在外部的DTD文件,引入XML中的语法:?xmlversion=”1.0”encoding=”UTF-8”?!--使用外部DTD文件--!DOCTYPEpetsSYSTEM“pet.dtd”//引入外部DTD文件自定义标签……5.3XML中特殊字符语法:![CDATA[需要出现的特殊字符]]6.XML文件配置样式:配置css:用来处理XML的显示格式?xmlversion=1.0encoding=GBK??xml-stylesheethref=test.csstype=text/css?//引入css样式文件语法personname中文/namephone62350411/phonephone51283346/phone/person定义如下样式:name{font-size:25px;color:#00FF33;}7.XML的四种解析方式:7.1以DOM方式解析。优点是可以对文档的内容和结构进行修改,但不适合大文件的读取。7.1.1使用DOM解析XML文档步骤如下:1.创建解析器工程对象2.由解析器工厂对象创建解析器对象3.由解析器对象对指定的XML文件进行解析,构建响应的DOM树,创建Document对象。4.以Document对象为起点对DOM树的节点进行增删改查操作。Document对象的主要方法:getElementsByTagName(String):返回一个NodeList对象,它包含了所有给定标签名字的标签。getDocumentElement():返回代表这个DOM树的根节点的Element对象,也就是代表XML文档根元素的那个对象。NodeList是指一个包含了一个或者多个节点(Node)的列表,可以通过方法来获得列表中的元素。NodeList的两个方法:getLength():返回列表的长度。item(int):返回指定位置的Node对象。Node对象是DOM结构中最基本的对象,代表了文档树中的一个抽象节点。Node对象的主要方法方法名说明getChildNodes()包含此节点的所有子节点的NodeListgetFirstChild()如果节点存在子节点,则返回第一个子节点getLastChild()如果节点存在子节点,则返回最后一个子节点getNextSibling()返回在DOM树中这个节点的下一个兄弟节点getPreviousSibling()返回在DOM树中这个节点的上一个兄弟节点getNodeName()根据节点的类型返回节点的名称getNodeValue()返回节点的值getNodeType()返回节点类型Element对象代表XML文档中的标签元素,继承自Node,也是Node最主要的子对象。在标签中可以包含属性,因而Element对象中也有存取其属性的方法:getAttribute(String):返回标签中给定属性名称的属性的值。getElementsByTagName(String):返回具有给定标记名称的所有后代Elements的NodeList。例:packagecom.xaccp.xml;importjava.io.FileNotFoundException;importjava.io.IOException;importjavax.xml.parsers.DocumentBuilder;importjavax.xml.parsers.DocumentBuilderFactory;importjavax.xml.parsers.ParserConfigurationException;importorg.w3c.dom.Document;importorg.w3c.dom.Element;importorg.w3c.dom.Node;importorg.w3c.dom.NodeList;importorg.xml.sax.SAXException;publicclassTestDOM{publicstaticvoidmain(String[]args){//1、得到DOM解析器的工厂实例DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();try{//2、从DOM工厂获得DOM解析器DocumentBuilderdb=dbf.newDocumentBuilder();//3、解析XML文档,得到一个Document,即DOM树Documentdoc=db.parse(pet2.xml);//4、得到所有DOG节点列表信息NodeListdogList=doc.getElementsByTagName(dog);System.out.println(xml文档中共有+dogList.getLength()+条狗狗信);//5、轮循狗狗信息for(inti=0;idogList.getLength();i++){//5.1、获取第i+1个狗狗元素信息Nodedog=dogList.item(i);//5.2、获取第i个狗狗元素的id属性的值并输出Elementelement=(Element)dog;StringattrValue=element.getAttribute(id);System.out.println(id:+attrValue);//5.3、获取第i个狗狗元素的所有子元素的名称和值并输出for(Nodenode=dog.getFirstChild();node!=null;node=node.getNextSibling()){if(node.getNodeType()==Node.ELEMENT_NODE){Stringname=node.getNodeName();Stringvalue=node.getFirstChild().getNodeValue();System.out.print(name+:+value+\t);}}System.out.println();}}catch(ParserConfigurationExceptione){e.printStackTrace();}catch(FileNotFoundExceptione){e.printStackTrace();}catch(SAXExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}}7.2以SAX方式解析。SAX模型最大的优点是内存消耗小,因为整个文档无需一次加载到内存中,这使SAX解析器可以解析大于系统内存的文档。缺点是不能修改文档。packagecom.xaccp.xml;importjava.util.Stack;importorg.xml.sax.*;importorg.xml.sax.helpers.*;importjavax.xml.parsers.*;publicclassSaxTestextendsDefaultHandler{java.util.Stacktags=newjava.util.Stack();publicSaxTest(){super();}publicvoidcharacters(charch[],intstart,intlength)throwsSAXException{Stringtag=(String)tags.peek();if(tag.equals(NO)){System.out.print(车牌号码:+newString(ch,start,length));}if(tag.equals(ADDR)){System.out.println(地址:+newString(ch,start,length));}}publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattrs){tags.push(qName);}publicstaticvoidmain(Stringargs[]){try{SAXParserFactorysf=SAXParserFactory.newInstance();SAXParsersp=sf.newSAXParser();SaxTestreader=newSaxTest();sp.parse(newInputSource(test.xml),reader);}catch(Exceptione){e.printStackTrace();}}}7.3通过JDOM组件。可以认为JDOM=DOM+SAX,折合了两种的优点。packagecom.xaccp.xml;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;importorg.jdom.Document;importorg.jdom.Element;importorg.jdom.input.SAXBuilder;importjava.io
本文标题:第十四章XML和FileIO
链接地址:https://www.777doc.com/doc-2164713 .html