使用DOM4J解析XML及采用Schema校验的方法
Validation
Currentlydom4jdoesnotcomewithavalidationengine.Youareforcedtouseaexternalvalidator(译:dom4j无校验引擎,需使用外部校验).InthepastwerecommendedXerces,butnowyouareabletouseSunMulti-SchemaXMLValidator(原来推荐Xerces,但是现在推荐Sun的复合描述XML校验器).XercesisabletovalidateagainstDTDsandXMLSchema,butnotagainstTREXorRelax.TheSunsMultiSchemaValidator(MSV)supportsallmentionedkindsofvalidation(Xerces可以按DTD和Schema标准解析,但是不能够根据TREX和Relax标准解析,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.
相关推荐
ava校验XML是件很扯淡的事情,... 下面不扯这些废话了,我用DOM4j结合javaxml api使用XSD来校验一个xml有效性,下面这个例子虽然和蹩脚,但是也费了一番功夫,放出来大家研究吧,有更好的实现也希望能和我一同分享。
由于DOM4J在解析XML时只能一层一层解析,所以当XML文件层数过多时使用会很不方便, 结合XPATH就可以直接获取到某个元素 使用dom4j支持xpath的操作的几种主要形式 第一种形式 /a/b/c: 表示一层...
因此,解析器也分为两种,一种是验证的,即会跟据XML文件中的声明,用相应的DTD文件对XML文件进行校验,检查它是否满足DTD文件的要求。另一种是忽略DTD文件,只要基本格式正确,就可以进行解析。 就我所知,验证的...
X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。
X3D是一种专为万维网而设计的三... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所发为其通用规范中的一个。英文
X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。
X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。
X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。
X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。
X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。
X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。
X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。
X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。
.....XML_Schema(文档描述与校验技术之一) .....XML_DOM(文档编程接口之一) .....XML_SAX(文档编程接口之一) .....EJB体系结构 .....会话与消息驱动Bean .....AJAX .....JAXB .....Mail(邮件) .....Security(加密...
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 20、abstract class和interface有什么区别? ...
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 17、abstract class和interface有什么区别? 声明方法...