XMLBEANS 20.docx
- 文档编号:5330174
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:16
- 大小:265.67KB
XMLBEANS 20.docx
《XMLBEANS 20.docx》由会员分享,可在线阅读,更多相关《XMLBEANS 20.docx(16页珍藏版)》请在冰豆网上搜索。
XMLBEANS20
XMLBeans简介
W3CXMLSchema是一个XML文档,该文档定义一组其他XML文档必须遵守才合法的规则。
与早期XML模式语言如文档类型定义(documenttypedefinition,DTD)或简单对象XML(simpleobjectXML,SOX)相比,W3CXMLSchema具有许多优点,它还提供了可供用户以多种方式使用的丰富特性集。
XMLBeans是完全与模式兼容的XML-Java绑定工具,使用这个工具可以以对Java友好的方式访问XML的全部特性。
XMLBean解决方案是独一无二的,因为它提供XML数据的双重视图。
XMLBeans维护一个信息和结构均未更改的原始XML文档,并提供一个基于Java的XML数据视图。
现在我们通过显示一些代码示例来演示XMLBeans2.0中的一些特性。
在每个示例中,我们都会提供模式以及一些操纵模式的XMLBean表示的Java代码。
模式和Java示例都可供下载。
下面我们来看下面的模式片断:
1 elementname="order"> 2 complexType> 3 sequence> 4 elementname="orderNo"type="xs: string"/> 5 elementname="item"nillable="true" 6 maxOccurs="unbounded"type="tns: itemType"/> 7 elementname="address"type="tns: addressType"/> 8 elementname="quantity"type="tns: quantityType"/> 10 sequence> 11 complexType> 12 element> 要生成XMLBeans类,需要对模式进行编译。 使用scomp实用工具可以很轻松地完成这个任务,因为它可以为所有简单和复杂的类型生成接口。 所有类和接口的包名均派生自模式中指定的targetNamespace值。 现在我们看看如何生成实例文档,如何针对模式检查文档的有效性,以及如何将实例保存到文件系统。 下面所生成的OrderDocument接口是一个XMLBeans为任意全局元素或类型创建的特殊“文档”类型示例。 AddressType和ItemType是为全局复杂类型addressType和sizeType创建的接口: 1OrderDocumentorderDoc=OrderDocument.Factory.newInstance(); 2Orderorder=orderDoc.addNewOrder(); 3order.setOrderNo("ORD1234"); 4order.setQuantity(4); 5 6AddressTypeaType=order.addNewAddress(); 7aType.setCity("Kirkland"); 8 9ItemTypeiType=order.addNewItem(); 10iType.setId("ITEM003"); 11 12booleanisValid=orderDoc.validate(xopt); 13 14orderDoc.save(newFile("sample.xml"),xopt); 运行此示例会导致构建一个实例文档,该文档将被验证并以“sample.xml”为名保存在本地文件系统中。 该程序还会将此实例文档的内容以及验证测试的结果显示到命令提示符或Unixshell中: 1 orderxmlns: sam="http: //temp.openuri.org/Sample"> 2 orderNo>ORD1234 orderNo> 3 item> 4 id>ITEM003 id> 5 description>LatestItem description> 6 size>Large size> 7 item> 8 address> 9 Name>BEASystems,Inc Name> 10 Street>10230NEPointsDrive,Ste300 Street> 11 City>Kirkland City> 12 Zip>98033 Zip> 13 State>WA State> 14 Country>USA Country> 15 address> 16 quantity>4 quantity> 17 order> 这是一个有效的实例文档。 在编译一个模式时,从模式生成的API会与表示底层XML模式的XMLBeans类型系统相集成。 对模型相关信息的访问权限可通过使用模式类型系统API获取。 在下一个示例中,我们将展示如何使用getEnumerationValues()方法编程式地访问特定模式类型的多个枚举值。 我们使用的模式类型是sizeType,它是带有三个可能值的枚举类型。 该模式片断如下所示: 1 simpleTypename="sizeType"> 2 restrictionbase="xs: token"> 3 enumerationvalue="Small"/> 4 enumerationvalue="Medium"/> 5 enumerationvalue="Large"/> 6 restriction> 7 simpleType> SizeType是SchemaType类,它包含关于simpleType模式类型的信息: SchemaTypeschType=null; XmlAnySimpleType[]xmlarray=null; SizeTypesType=SizeType.Factory.newInstance(); schType=sType.schemaType(); xmlarray=schType.getEnumerationValues(); 运行此代码示例(EnumerationSample.java)将导致编程式地获取枚举值并将其重定向到System.out: EnumerationvaluesforItemType: Small Medium Large XmlCursor是XMLBeans中的一个有趣特性;它们提供一种操作或导航XML实例文档的直观方法。 XmlCursor还提供了一种执行XQuery表达式的方法。 一旦加载了XML文档,就可以创建一个游标来表示XML中的特定位置。 因为用户可以使用具有或不具有对应于XML的模式的游标,因此游标是处理XML的理想方法。 下一个示例演示如何使用游标操作XMLBean实例。 此示例分析在第一个示例中创建的sample.xml。 一旦将该文件保存到内存中,就会使用XmlCursorAPI导航到quantity元素并将值更改为104: orderDoc=OrderDocument.Factory.parse(newFile("sample.xml")); XmlCursorxcursor=orderDoc.newCursor(); xcursor.toFirstChild(); xcursor.toChild(3); xcursor.toEndToken(); xcursor.toPrevChar (1); xcursor.insertChars("10"); xcursor.dispose(); 运行此示例会生成下面的输出,它显示修改后的XMLBean文档为什么会无效: Message: decimal value(104)isgreaterthanmaxInclusivefacet(5)for quantityTypeinnamespacehttp: //temp.openuri.org/Sample LocationofinvalidXML: sam="http: //temp.openuri.org/Sample"/> 到目前为止,我们已经简要介绍了XMLBeans,现在介绍一下2.0版本中的新特性。 XMLBeans2.0中的新特性 通常,通过观察产品的实际运行来了解其中的新特性是比较简便的方法。 我们将通过介绍一个利用了XMLBeans的某些重要特性的项目来介绍这些新特性。 众所周知,XMLBeans是一个Apache项目,所以它使用Atlassian的Jira问题跟踪和项目管理应用程序来跟踪bug、特性和其他问题。 BEA对XMLBeans项目进行了投资,并拥有一个提供高质量软件的标准。 这意味着BEA很关注XMLBeans之类项目的质量。 由于XMLBeans是开源项目,并且它使用Apache的常见工具如Jira,所以问题就在于BEA如何跟踪XMLBeans的质量指标。 用于揭示XMLBeans2.0中的一些新特性的计划就是对这个问题的回答: 如何方便地从Jira收集质量指标? 下面的屏幕快照显示了XMLBeans的项目主页面。 请看图片的右边,在ProjectSummary区域下可以看到一些与我们关心的质量指标问题相关的选项。 图1: XMLBeansJira项目页面 Jira的一个好处就是它能提供问题数据的不同视图。 在下图中,请看名为CurrentView的标题。 在屏幕快照中,目前选择的是Browser视图,但还有其他选项,包括一个打印视图、一个XML视图,甚至还有一个Excel电子表格视图: 图2: XMLBeansJiraIssueNavigator 熟悉Jira以及XMLBeans跟踪质量指标的方式后,我们可以通过多种方式收集质量指标。 我们的选项包括屏幕抓取HTML、分析电子表格以及从URL获取XML。 我们认为最合理的是从URL(通过从IssueNavigator页面单击XML链接而提供)使用XML视图。 该URL的内容看起来与下面的XML文档类似: xmlversion="1.0"encoding="utf-8"? > -- RSSgeneratedbyJIRA98atSunDec0418: 08: 34CET2005 --> http: //issues.apache.org/jira issues http: //issues.apache.org/jira/browse/x --leftoutforbrevity--> [CDATA[]]> Rusin 29: 44+0100 (CET) 15: 10+0100 (CET) 18: 15: 10+0100(CET)"level=""> --...--> --leftoutforbrevity--> 如果从上面的XMLfeed查看片断,会发现它被定义为RSSfeed。 我们的第一步是找到一个RSS0.92版本的XMLSchema模式,这样就可以编译模式,并通过使用XMLBeans的类似于JavaBean的简单API来使用XMLBeans分析URL。 我们无法找到官方模式,但可以找到规范,并可由此开始创建模式。 随后,我们发现根据规范创建的模式与从Jira获取的RSSfeed不匹配。 我们该怎么做呢? 我们实际上惟一可以选择的就是为此RSSfeed创建一个模式,但这费时且容易出错。 进行了进一步的调查后,我们偶然发现了新增的inst2xsd特性。 模式到实例再到模式的过程 inst2xsd工具可作为命令行实用工具使用,但用户也可以编程式地使用API。 其目的是采用一个XML实例并创建一个合法模式集。 该工具也是可配置的,它提供了用于指定使用哪种设计模式的选项。 该工具还能够将枚举映射到重复值,并能够根据数据类型的最小公分母创建类型。 我们使用lcd: val这个值作为创建最小公分母类型的示例。 该文本可由多个内置XMLSchema数据类型表示,例如字符串派生的类型(xsd: string、xsd: normalizedString、xsd: token,等等)以及QName类型。 在本例中,inst2xsd特性确定类型的方式是查找前缀为lcd的命名空间声明。 如果找到该前缀,该类型将是QName,而不是某个可能基于字符串的类型。 现在看一下我们从Jira接收的RSSfeed的结果是什么。 如果我们已经将feed保存到名为jiraRssFeed.xml的实例中并已将XMLBEANS_HOME_in放在我们的路径中,工作流将如下: /home/user>inst2xsd GeneratesXMLSchemafrominstancexmldocuments. Usage: inst2xsd[opts][instance.xml]* Optionsinclude: -design[rd|ss|vb]-XMLSchemadesigntype rd -RussianDollDesign-localelementsandlocaltypes ss -SalamiSliceDesign-globalelementsandlocal types vb -VenetianBlindDesign(default)-localelementsand globalcomplextypes -simple-content-types[smart|string]-Simplecontenttypes detection(leaftext).Smartisthedefault -enumerations[never|NUMBER]-Useenumerations.Default valueis10. -outDir[dir]-Directoryforoutputfiles.Defaultis'.' -outPrefix[file_name_prefix]-Prefixforoutputfilenames. Defaultis'schema' -validate-Validatesinputinstancesagainstgenerated schemas. -verbose-printmoreinformationalmessages -license-printlicenseinformation -help-helpinformation /home/user>inst2xsdjiraRssFeed.xml-enumerationsnever -designrd-verbose-validate #thisgeneratesaschemanamedschema0.xsd 这将生成名为schema0.xsd的(可配置)文件,并且模式将与下面的片断类似: 1 xmlversion="1.0"encoding="UTF-8"? > 2 schemaattributeFormDefault="unqualified" elementFormDefault="qualified" xmlns: xs="http: //www.w3.org/2001/XMLSchema"> 3 elementname="rss"> 4 annotation> 5 documentation>RSSgeneratedbyJIRA98... documentation> 6 annotation> 7 complexType> 8 sequence> 9 elementname="channel"> 10 complexType> 11 sequence> 12 elementtype="xs: string"name="title"/> 13 elementtype="xs: anyURI"name="link"/> 14 elementtype="xs: string"name="description"/> 15 elementtype="xs: string"name="language"/> 15 elementname="item"maxOccurs="unbounded" minOccurs="0"> 从这个片断中我们发现JiraRSSfeed所需的所有元素均已定义。 如果用户想要通过其他方式工作,例如从XMLSchema开始,XMLBeans的最新版本就提供了这种功能。 xsd2inst工具就为用户提供了从模式和全局元素创建示例文档的方式;该实例将包含简单类型的值。 上述两种工具的使用使得使用XML实例和模式变得非常简单。 在项目的这个阶段,我们就拥有了一个模式,使用这个模式可以通过scomp实用工具创建一个XMLBeans类型jar,并可开始处理业务逻辑以及先前尝试收集的质量指标。 通过查看JiraRSSfeed实例,我们发现我们关注的bug详细信息放在名为item的元素中,而且生成的模式将item元素作为数组。 这意味着,如果我们想要获得可能出现在所有项中的信息,就需要迭代所有项。 现在我们看看如何通过一些代码实现这个目标。 在下面的代码中,我们会遇到名字被指定为方法参数的用户导致的所有问题: 1publicVectorgetItemsFromReporter(Stringreporter){ 2 3 //GettheJiraRSSfeedinstancefromaURL 4 URLjiraFeedUrl;=newURL(""); 5 6 //Getinstanceobjects 7 RssDocumentrssDoc=RssDocument.Factory.parse(jiraFeedUrl); 8 RssDocument.Rssrss=rssDoc.getRss(); 9 RssDocument.Rss.Channelchannel=rss.getChannel(); 10 11 //Wewillusethisobjecttogetmostofourdata 12 RssDocument.Rss.Channel.Item[]items=channel.getItemArray(); 13 14 //Wewillstoreallofthevalidresultsinavector 15 Vectorresults=newVector(); 16 17 for(inti=0;i 18 RssDocument.Rss.Channel.Itemitem=items[i]; 19 20 //Additemtoresultsvectorwhenreporter==username 21 if(item.getReporter().getUsername().compareTo(reporter)==0) 22 results.add(item); 23 } 24 } 25 26 returnresults; 27} 可以看出,这是非常整洁的Java代码。 但是,当项数变大时,使用此代码也会影响性能。 在最新的XMLBeans版本中,新增了两个新特性来帮助解决这些问题。 第一个特性是对J
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- XMLBEANS 20
