`
JAVA天地
  • 浏览: 658566 次
  • 性别: Icon_minigender_1
  • 来自: 太原
文章分类
社区版块
存档分类
最新评论

使用DOM4J解析XML及采用Schema校验的方法

阅读更多

使用DOM4J解析XML及采用Schema校验的方法

Validation

Currentlydom4jdoesnotcomewithavalidationengine.Youareforcedtouseaexternalvalidator(译:dom4j无校验引擎,需使用外部校验).InthepastwerecommendedXerces,butnowyouareabletouseSunMulti-SchemaXMLValidator(原来推荐Xerces,但是现在推荐Sun的复合描述XML校验器).XercesisabletovalidateagainstDTDsandXMLSchema,butnotagainstTREXorRelax.TheSunsMultiSchemaValidator(MSV)supportsallmentionedkindsofvalidation(Xerces可以按DTDSchema标准解析,但是不能够根据TREXRelax标准解析,Sun的复合描述XML校验器可以支持所有上面提到的校验器).

Validationconsumesvaluableresources.Useitwisely.(有选择的使用校验器,下面介绍两种)

第一种:ApachesXerces1.4.x+dom4j

UsingApachesXerces1.4.xanddom4jforvalidation

ItiseasytouseXerces1.4.xforvalidation.DownloadXercesfromApachesXMLwebsites.Experienceshowsthatthenewestversionisnotalwaysthebest.ViewXercesmailinglistsinordertofindoutissueswithspecificversions.XercesprovidesSchemasupportstrartingfrom1.4.0.

Turnonvalidationmode-whichisfalsefordefault-usingaSAXReaderinstance(打开SAXReader的校验模式,默认为不打开的)

SetthefollowingXercespropertyhttp://apache.org/xml/properties/schema/external-noNamespaceSchemaLocationusingtheschemaURI.

以下是校验示例

CreateaSAXXMLErrorHandlerandinstallittoyourSAXReaderinstance.

ParseandvalidatetheDocument.

OutputValidation/Parsingerrors.

importorg.dom4j.Document;

importorg.dom4j.Element;

importorg.dom4j.io.OutputFormat;

importorg.dom4j.io.SAXReader;

importorg.dom4j.io.XMLWriter;

importorg.dom4j.util.XMLErrorHandler;

importorg.xml.sax.ErrorHandler;

importorg.xml.sax.SAXParseException

publicclassSimpleValidationDemo{

publicstaticvoidmain(String[]args){

SAXReaderreader=newSAXReader();

reader.setValidation(true);

//specifytheschematouse

reader.setProperty(

"http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation",

"prices.xsd"

);

//adderrorhandlerwhichturnsanyerrorsintoXML

XMLErrorHandlererrorHandler=newXMLErrorHandler();

reader.setErrorHandler(errorHandler);

//parsethedocument

Documentdocument=reader.read(args[0]);

//outputtheerrorsXML

XMLWriterwriter=newXMLWriter(OutputFormat.createPrettyPrint());

writer.write(errorHandler.getErrors());

}

Both,XerecsandCrimson,areJaXPableparsers.BecarefulwhileusingCrimsonandXercesinsameclasspath.XerceswillworkcorrectlyonlywhenitisspecifiedinclasspathbeforeCrimson.AtthistimeIrecommendthatyoushouldeitherXerecesorCrimson.

第二种:MSV+dom4j(完美组合)

Aperfectteam-MultiSchemaValidatorMSVanddom4j

KohsukeKawaguchiadeveloperfromSuncreatedaextremlyusefulltoolforXMLvalidation.MultiSchemaValidator(MSV)supportsfollowingspecifications:

RelaxNG

Relax

TREX

XMLDTDs

XMLSchema

CurrentlyitsnotclearwhetherXMLSchemawillbethenextstandardforvalidation.RelaxNGhasanevermoregrowinglobby.IfyouwanttobuildaopenapplicationthatisnotfixedtoaspecificXMLparserandspecifictypeofXMLvalidationyoushouldusethispowerfulltool.AsusageofMSVisnottrivialthenextsectionshowshowtouseitinsimplerway.

SimplifiedMulti-SchemaValidationbyusingJavaAPIforRELAXVerifiers(JARV)

TheJavaAPIforRELAXVerifiersJARVdefinesasetofInterfacesandprovideaschemataandvendorneutralAPIforvalidationofXMLdocuments.TheaboveexplainedMSVoffersaFactorythatsupportsJARV.SoyoucanusetheJARVAPIontopofMSVanddom4jtovalidateadom4jdocuments.

importorg.iso_relax.verifier.Schema;

importorg.iso_relax.verifier.Verifier;

importorg.iso_relax.verifier.VerifierFactory;

importorg.iso_relax.verifier.VerifierHandler;

importcom.sun.msv.verifier.jarv.TheFactoryImpl;

importorg.apache.log4j.Category;

importorg.dom4j.Document;

importorg.dom4j.io.SAXWriter;

importorg.xml.sax.ErrorHandler;

importorg.xml.sax.SAXParseException;

publicclassValidator{

privatefinalstaticCATEGORY=Category.getInstance(Validator.class);

privateStringschemaURI;

privateDocumentdocument;

publicValidator(Documentdocument,StringschemaURI){

this.schemaURI=schemaURI;

this.document=document;

}

publicbooleanvalidate()throwsException{

//(1)useautodetectionofschemas

VerifierFactoryfactory=newcom.sun.msv.verifier.jarv.TheFactoryImpl();

Schemaschema=factory.compileSchema(schemaURI);

//(2)configureaVertifier

Verifierverifier=schema.newVerifier();

verifier.setErrorHandler(

newErrorHandler(){

publicvoiderror(SAXParseExceptionsaxParseEx){

CATEGORY.error("Errorduringvalidation.",saxParseEx);

}

publicvoidfatalError(SAXParseExceptionsaxParseEx){

CATEGORY.fatal("Fatalerrorduringvalidation.",saxParseEx);

}

publicvoidwarning(SAXParseExceptionsaxParseEx){

CATEGORY.warn(saxParseEx);

}

}

);

//(3)startingvalidationbyresolvingthedom4jdocumentintosax

VerifierHandlerhandler=verifier.getVerifierHandler();

SAXWriterwriter=newSAXWriter(handler);

writer.write(document);

returnhandler.isValid();

}

}

}

Thewholeworkintheaboveexampleisdoneinvalidate()method.ForemostthewecreateaFactoryinstanceanduseittocreateaJAVRorg.iso_relax.verifier.Schemainstance.Insecondstepwecreateandconfigureaorg.iso_relax.verifier.Verifierusingaorg.sax.ErrorHandler.IuseApachesLog4jAPItologpossibleerrors.YoucanalsouseSystem.out.println()or,dependingoftheapplicationsdesiredrobustness,anyothermethodtoprovideinformationaboutfailures.Thirdandlaststepresolvestheorg.dom4j.DocumentinstanceusingSAXinordertostartthevalidation.Finallywereturnabooleanvaluethatinformsaboutsuccessofthevalidation.

Usingteamworkofdom4j,MSV,JAVRandgoodoldSAXsimplifiestheusageofmultischematavalidationwhilegainingthepowerofMSV.

XSLTdefinesadeclarativerule-basedwaytotransformXMLtreeintoplaintext,HTML,FOoranyothertext-basedformat.XSLTisverypowerful.Ironicallyitdoesnotneedvariablestoholddata.AsMichaelKayXSLTReferencesays:"Thisstyleofcodingwithoutassignmentstatements,iscalledFunctionalProgramming.TheearliestandmostfamousfunctionalprogramminglanguagewasLisp...,whilemodernexamplesincludeMLandScheme."InXSLTyoudefineasocalledtemplatethatmatchesacertainXPathexpression.TheXSLTProcessortraversethesourcetreeusingarecursivetreedescentalgorithmandperformsthecommandsyoudefinedwhenaspecifictreebranchmatchesthetemplaterule.

dom4joffersanAPIthatsupportsXSLTsimilarrulebasedprocessing.TheAPIcanbefoundinorg.dom4j.rulepackageandthischapterwillintroduceyoutothispowerfulfeatureofdom4j.

<!--EndFragment-->
分享到:
评论

相关推荐

    Java通过XML Schema校验XML

    ava校验XML是件很扯淡的事情,... 下面不扯这些废话了,我用DOM4j结合javaxml api使用XSD来校验一个xml有效性,下面这个例子虽然和蹩脚,但是也费了一番功夫,放出来大家研究吧,有更好的实现也希望能和我一同分享。

    day023-xml解析笔记和代码.rar

    由于DOM4J在解析XML时只能一层一层解析,所以当XML文件层数过多时使用会很不方便, 结合XPATH就可以直接获取到某个元素 使用dom4j支持xpath的操作的几种主要形式 第一种形式 /a/b/c: 表示一层...

    tinyxml+tinyxpath组合编程套件,很好的编程工具,都是源码

    因此,解析器也分为两种,一种是验证的,即会跟据XML文件中的声明,用相应的DTD文件对XML文件进行校验,检查它是否满足DTD文件的要求。另一种是忽略DTD文件,只要基本格式正确,就可以进行解析。 就我所知,验证的...

    ISO-IEC-19776-1.2-X3DEncodings-XML

    X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。

    ISO-IEC-19775-1.2-X3D-AbstractSpecification

    X3D是一种专为万维网而设计的三... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所发为其通用规范中的一个。英文

    ISO-IEC-19776-X3DEncodings-All-Edition-1

    X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。

    ISO-IEC-19777-X3DLanguageBindings

    X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。

    ISO-IEC-19777-2-X3DLanguageBindings-Java

    X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。

    ISO-IEC-19776-3-X3DEncodings-CompressedBinary

    X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。

    ISO-IEC-19777-1-X3DLanguageBindings-ECMAScript

    X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。

    ISO-IEC-FDIS-19775-2.2-X3D-SceneAccessInterface

    X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。

    ISO-IEC-19776-2.2-X3DEncodings-ClassicVRML

    X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。

    ISO-IEC-FCD-19776-3.2-X3DEncodings-CompressedBinary

    X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。

    J2EE(Java EE)技术总结-J2EE学习精华教程-电子书

    .....XML_Schema(文档描述与校验技术之一) .....XML_DOM(文档编程接口之一) .....XML_SAX(文档编程接口之一) .....EJB体系结构 .....会话与消息驱动Bean .....AJAX .....JAXB .....Mail(邮件) .....Security(加密...

    超级有影响力霸气的Java面试题大全文档

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 20、abstract class和interface有什么区别? ...

    java 面试题 总结

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 17、abstract class和interface有什么区别? 声明方法...

Global site tag (gtag.js) - Google Analytics