第17章 xml解析.docx

上传人:b****5 文档编号:7266135 上传时间:2023-01-22 格式:DOCX 页数:26 大小:221.76KB
下载 相关 举报
第17章 xml解析.docx_第1页
第1页 / 共26页
第17章 xml解析.docx_第2页
第2页 / 共26页
第17章 xml解析.docx_第3页
第3页 / 共26页
第17章 xml解析.docx_第4页
第4页 / 共26页
第17章 xml解析.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

第17章 xml解析.docx

《第17章 xml解析.docx》由会员分享,可在线阅读,更多相关《第17章 xml解析.docx(26页珍藏版)》请在冰豆网上搜索。

第17章 xml解析.docx

第17章xml解析

第17章xml解析

1.XML技术和初识

XML和HTML一样是根据SGML(标准通用标记语言,由于其语法与限制较多,因此没有流行起来)标准演化而来。

XML是一种平台无关的数据表现形式。

在企业中一般是用于存储数据以及配置整体项目。

例:

如果想用一个xml文件存储人的信息,包括人的姓名,年龄。

xmlversion="1.0"?

>

Jack

18

Tom

19

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 -->

Jack

18

Tom

19

这里的红字部分为文档的正文,其中表示标签的根元素。

根元素有且只能有一个,根元素中可以有其他子元素。

--内容-->表示注释内容。

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();

Iteratorit=root.elementIterator();

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){

Listlist=this.getUserinfoListFromDB();

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用户列表

*/

publicListgetUserinfoListFromXML(StringfilePath){

ListuserList=newArrayList();

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1