第17章 xml解析.docx
- 文档编号:7266135
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:26
- 大小:221.76KB
第17章 xml解析.docx
《第17章 xml解析.docx》由会员分享,可在线阅读,更多相关《第17章 xml解析.docx(26页珍藏版)》请在冰豆网上搜索。
第17章xml解析
第17章xml解析
1.XML技术和初识
XML和HTML一样是根据SGML(标准通用标记语言,由于其语法与限制较多,因此没有流行起来)标准演化而来。
XML是一种平台无关的数据表现形式。
在企业中一般是用于存储数据以及配置整体项目。
例:
如果想用一个xml文件存储人的信息,包括人的姓名,年龄。
xmlversion="1.0"?
>
2.XML文档
1)
xmlversion="1.0"?
>叫做xml的声明,其有3个属性,分别为version,encoding,standalone,第一个表示版本一般均为1.0(最新版本为1.1)。
encoding为xml文档的字符编码,默认为UTF-8,也可以为gb2312等。
standalone表示是否为独立的xml文档不依赖于其他文件,yes表示独立,no表示有可能以来其他文件。
注意:
1.一般只需写version即可,语言建议使用UTF-8,如果三个属性一起使用,之间的顺序一定要为version,encoding,standalone。
2.如果使用“记事本”编辑xml,保存时一定要把“编码”改为“UTF-8”,否则会出现问题(文本存储编码格式与代码编写指定的编码格式不同)。
“保存类型”改为“所有文件”。
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEstruts-configPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration1.3//EN""http:
//struts.apache.org/dtds/struts-config_1_3.dtd">
attribute="userForm" name="userForm" path="/user" scope="request" type="com.fly.webtest.struts.action.UserAction" cancellable="true"/> 2) DOCTYPEstruts-configPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration1.3//EN""http: //struts.apache.org/dtds/struts-config_1_3.dtd"> 表示文档类型定义,用于确定文档正确性的,可有可无。 3)文档的正文, xmlversion="1.0"? > --Jack --> 这里的红字部分为文档的正文,其中 根元素有且只能有一个,根元素中可以有其他子元素。 --内容-->表示注释内容。 3.DTD与Schema 由于xml的语法较灵活,为规范xml的语法规则以及标签词汇,因此需要为xml文档定义相应的语法与词汇,常用的规则有DTD(文档类型定义,xml标准),Schema(如今已使用的越来越多,有逐渐代替DTD的趋势)。 DTD: 优点: 简单,出现的早使用率大 缺点: 本身不符合xml,数据类型支持不佳,语法较怪异,一般不支持命名空间,不适合操作大型的xml。 对于DTD规则的定义一般分为两种,一种是直接写到xml中,一种是单独写成dtd文件。 由于dtd的内容一般都较多,因此大部分都是单独创建dtd文件。 DOCTYPEstruts-configPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration1.3//EN""http: //struts.apache.org/dtds/struts-config_1_3.dtd"> 1)就是外部引用dtd,红字部分就是dtd的路径,当然如果是我们定义的dtd,可以直接写dtd的路径。 2)struts-config表示根元素的名字 3)PUBLIC表示共有的,也可以换成SYSTEM为公开自己创建的 4)-表示未被改进的为ISO标识,+被改进的非ISO标识,ISO为ISO标识。 5)DTDStrutsConfiguration1.3表示版本 6)EN表示语言 xmlversion="1.0"encoding="UTF-8"? > ELEMENTbooks(book*)> ELEMENTbook(name,author+,price*)> ELEMENTname(#PCDATA)> ELEMENTauthor(#PCDATA)> ELEMENTprice(#PCDATA)> 简单的dtd定义, ELEMENT表示顶一个元素,books表示根元素,book表示根元素中的子元素,*表示可以有0个或多个。 ELEMENTbook(name,author+,price*)>表示子元素中还有name,author,price3个元素。 其中的“,”表示name,author,price的顺序不能改变;如果换成“空格”则表示顺序可以改变。 Name之后什么也不写表示只能有一个,“+”表示有1个或多个。 “? ”表示0个或1个。 ELEMENTname(#PCDATA)>其中的#PCDATA表示普通文本文件;EMPTY表示空元素;ANY表示任意(一般不使用)。 属性定义: ATTLIST元素名称 属性1 属性类型 属性说明 属性1 属性类型 属性说明 ……….. > 如id属性加入: ATTLISTbookidCDATA#REQUIRED> 其中CDATA可以有如下选择: CDATA 表示为普通字符数据 ENUMERATED 表示枚举类型 ID 唯一类型 其中#REQUIRED有如下选择: #REQUIRED 必选的 #IMPLIED 可选的 #FIXED 必须为固定值,后面加“value” ATTLISTbookidID#REQUIRED>表示id必填 ATTLISTbookowner(Jack|Tom)"Tom">表示枚举关系 ATTLISTbookisGoodCDATA#FIXED"YES">表示固定值 Schema: 优点: 本身就是一个xml,数据类型更加严格,支持命名空间 缺点: 较复杂麻烦 具体内容,感兴趣的同学可以自学。 4.良好的与有效的XML文档及要求 结构良好的xml: 满足xml的语法规则。 有效的xml: 通过了DTD的验证。 因此“良好的”不一定是“有效的”;但“有效的”一定是“良好的”。 5.XML开发工具Eclipse及对XML开发的可视化技术支持(XML开发、XML文挡的检查,DTD等方面的支持) 可以利用MyEclipse等IDE工具开发xml,如图 选择相应的文件 例如: 创建一个XML 在MyEclipse中的Outline窗体,选中xml,鼠标右键,创建需要的内容。 很方便就可以创建xml 6.xml的解析,现在主流操作xml的解析技术与工具大致有dom,sax,jdom,dom4j。 (我们课上主要讲sax解析与jdom解析,其余两种有能力的学生自学。 ) 7.dom解析: 其实xml在数据结构上本身就是树,可以利用dom把xml读到内容中,组装成dom树,优点是使用方便,缺点是,当xml特别大时,很耗内存。 为w3c标准。 例: dom使用的是Java自带的api importjava.io.File; importjavax.xml.parsers.DocumentBuilder; importjavax.xml.parsers.DocumentBuilderFactory; importorg.w3c.dom.Document; importorg.w3c.dom.Node; importorg.w3c.dom.NodeList; publicclassDomParseXmlDemo{ publicvoidshowMessage(){ try{ DocumentBuilderFactorydocumentBuilderFactory=DocumentBuilderFactory.newInstance(); DocumentBuilderdocumentBuilder=documentBuilderFactory.newDocumentBuilder(); Documentdocument=documentBuilder.parse(newFile("xml/person.xml")); NodeListnodeList=document.getElementsByTagName("person"); for(inti=0;i Nodenode=nodeList.item(i); NodeListattributeList=node.getChildNodes(); for(intj=0;j NodeattributeNode=attributeList.item(j); if(attributeNode.hasChildNodes()){ System.out.println(attributeNode.getNodeName()+"="+attributeNode.getFirstChild().getNodeValue()); } } } }catch(Exceptione){ e.printStackTrace(); } } publicstaticvoidmain(String[]args){ DomParseXmlDemodpxd=newDomParseXmlDemo(); dpxd.showMessage(); } } 8.sax解析: sax解析是利用事件机制,每遇到一个标签,就触发相应的事件,优点,内存使用率相对较低。 缺点: 不适合修改xml importjava.io.File; importjavax.xml.parsers.SAXParser; importjavax.xml.parsers.SAXParserFactory; importorg.xml.sax.SAXException; importorg.xml.sax.helpers.DefaultHandler; publicclassSaxParseXmlDemo{ publicvoidshowMessage(){ try{ SAXParserFactorysaxparseFactory=SAXParserFactory.newInstance(); SAXParsersaxparse=saxparseFactory.newSAXParser(); saxparse.parse(newFile("xml/person.xml"),newSAXHander()); }catch(Exceptione){ } } privateclassSAXHanderextendsDefaultHandler{ @Override publicvoidcharacters(char[]ch,intstart,intlength) throwsSAXException{ Stringtext=newString(ch,start,length); if(text.trim().equals("")){ return; } System.out.println(text); } } publicstaticvoidmain(String[]args){ SaxParseXmlDemospxd=newSaxParseXmlDemo(); spxd.showMessage(); } } 9.jdom解析: 优点: 综合了dom与sax优点,缺点: 无法加载大型的xml文件, 需要额外驱动 importjava.io.File; importjava.util.List; importorg.jdom.Document; importorg.jdom.Element; importorg.jdom.input.SAXBuilder; publicclassJdomParseXmlDemo{ publicvoidshowMessage(){ try{ SAXBuildersaxbuilder=newSAXBuilder(); Documentdocument=saxbuilder.build(newFile("xml/person.xml")); Elementelement=document.getRootElement(); Listlist=element.getChildren(); for(inti=0;i Elemente=(Element)list.get(i); System.out.println(e.getChild("name").getText()); System.out.println(e.getChild("sex").getText()); } }catch(Exceptione){ e.printStackTrace(); } } publicstaticvoidmain(String[]args){ JdomParseXmlDemojpxd=newJdomParseXmlDemo(); jpxd.showMessage(); } } 10.dom4j解析: 相对来说,dom4j的效率最高。 如今越来越多的项目开始使用dom4j进行xml解析,包括Hibernate。 需要额外jar包 publicclassDom4jParseXmlDemo{ publicvoidshowMessage(){ try{ Filef=newFile("xml/person.xml"); SAXReaderreader=newSAXReader(); Documentdoc=reader.read(f); Elementroot=doc.getRootElement(); Iterator while(it.hasNext()){ Elementfoo=it.next(); System.out.println(foo.elementText("name")); System.out.println(foo.elementText("sex")); } }catch(DocumentExceptione){ e.printStackTrace(); } } publicstaticvoidmain(String[]args){ Dom4jParseXmlDemodom4j=newDom4jParseXmlDemo(); dom4j.showMessage(); } } 11.xml与数据库交互(从数据库读数据生成xml,从xml读数据插入数据库) Jdom实现 importjava.io.File; importjava.io.FileNotFoundException; importjava.io.FileOutputStream; importjava.io.IOException; importjava.sql.Connection; importjava.sql.DriverManager; importjava.sql.PreparedStatement; importjava.sql.ResultSet; importjava.sql.SQLException; importjava.sql.Statement; importjava.util.ArrayList; importjava.util.List; importorg.jdom.Document; importorg.jdom.Element; importorg.jdom.JDOMException; importorg.jdom.input.SAXBuilder; importorg.jdom.output.Format; importorg.jdom.output.XMLOutputter; publicclassXmlAndDBConvertForJdom{ /** *根据用户列表创建xml文件 *@paramfilepath文件路径 */ publicvoidmakeXML(Stringfilepath){ List Elementroot=newElement("users"); for(Useruser: list){ ElementchildNode=newElement("user"); ElementidNode=newElement("id"); idNode.setText(user.getId()+""); ElementusernameNode=newElement("username"); usernameNode.setText(user.getUsername()); ElementpasswordNode=newElement("password"); passwordNode.setText(user.getPassword()); childNode.addContent(idNode); childNode.addContent(usernameNode); childNode.addContent(passwordNode); root.addContent(childNode); } Documentdocument=newDocument(root); XMLOutputterxmlOutputter=newXMLOutputter(Format.getPrettyFormat()); try{ xmlOutputter.output(root,newFileOutputStream(filepath)); }catch(FileNotFoundExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } } /** *从xml中解析出用户信息,存储到List中 *@paramfilePath文件路径 *@return用户列表 */ publicList List SAXBuildersaxbuilder=newSAXBuilder(); try{ Documentdocument=saxbuilder.build(newFile(filePath)); Elementelement=document.getRootElement(); Listlist=element.getChildren(); for(inti=0;i Elemente=(Element)list.get(i); Useruser=newUser();user.setId(Integer.parseInt(e.getChild("id").getText())); user.setUsername(e.getChild("username").getText()); user.setPassword(e.getChild("password").getText()); userList.add(user); } }catch(JDOMExceptione){ e.printS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第17章 xml解析 17 xml 解析