使用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.
相关推荐
DOM4J提供了一种简单的方法来加载XML和XSD文件,然后使用Schema类进行校验。以下是一个基本的步骤概述: 1. 加载XSD文件:使用DOM4J的DocumentHelper类的parse方法,传入XSD文件的路径,得到一个SchemaFactory对象...
在本例中,作者选择使用DOM4j库来进行XML的解析与校验,并且结合了javax.xml.parsers包中的SAXParser来实现XML与XSD之间的校验。这种方法相对直观且易于理解。 #### 示例代码详解 首先,我们来看一下示例中给出的...
在Java中实现XML Schema校验,我们可以使用Java API for XML Processing (JAXP) 提供的工具,特别是SAX或者DOM解析器。SAX解析器是事件驱动的,它逐行解析XML文档并触发相应的事件,如遇到元素开始、元素结束等,...
2. **dom4j-1.6.1.jar**:这是一个流行的Java XML处理库,提供了DOM、SAX和JDOM等多种接口来操作XML文档。它支持XML Schema,可以帮助解析和构建XML文档,并进行schema校验。 3. **isorelax-20050913.jar**:ISO ...
例如,你可以使用`javax.xml.parsers.DocumentBuilderFactory`和`javax.xml.parsers.DocumentBuilder`创建DOM解析器,然后调用`parse()`方法解析XML文件。DOM解析适用于小型或中型XML文件,因为大型文件可能导致内存...
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> </xs:schema> ``` 上述XSD规定了一个名为"person"的元素,它包含两个子元素:"firstName"和"lastName",两者都必须是字符串类型。 接...
XML文档的结构严谨,为了确保其正确性和有效性,通常会使用XML校验工具来验证XML文档是否符合预定义的XML Schema(XSD)规范。"xmlValidate.rar" 是一个压缩包,包含了XML校验相关的工具和资源,便于用户进行XML报文...
- 验证XML文档:使用XML Schema Definition (XSD) 文件对XML进行校验,确保其符合预定义的规则。 7. **Namespaces**: - 在XML中,命名空间用于区分相同名称的元素和属性,通过前缀和URI(Uniform Resource ...
由于DOM4J在解析XML时只能一层一层解析,所以当XML文件层数过多时使用会很不方便, 结合XPATH就可以直接获取到某个元素 使用dom4j支持xpath的操作的几种主要形式 第一种形式 /a/b/c: 表示一层...
可以使用XML解析器,如Microsoft.XMLDOM(在IE5及以上版本的浏览器中内置),来加载XML文件并进行DTD验证。在JavaScript中,可以通过创建XML文档解析器对象,开启校验,然后加载XML文件,最后检查解析错误来实现这个...
DOM解析器会将整个XML树加载到内存中,占用大量资源;SAX是事件驱动的,适合流式处理,但不支持随机访问。而VTD-XML则兼顾了随机访问和资源效率。 6. **应用场景**:VTD-XML适用于大数据分析、XML文档的索引和搜索...
4. **解析器**:XML解析器负责读取XML文档并将其转化为程序可以处理的数据结构。有DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)等解析方式: - **DOM**:将整个XML...
TinyXml是一个轻量级的DOM解析库,主要适用于嵌入式系统或对内存使用有严格限制的项目。它不支持XML文档验证,但提供了方便的API来读写XML文档,使得操作XML结构变得直观。 4. XML4C: XML4C是IBM开发的XML解析库...
XML 文档可以通过 DTD 或 XML Schema 的校验来确保其合法性。XML 文档的合法性是保证 XML 文档正确性的一个重要方面。 本资源摘要信息涵盖了 XML 技术及应用的相关知识点,包括 XML 文档的结构定义、编程接口、文档...
在C++中处理XML文件,主要依赖于.NET框架提供的这些命名空间中的类和方法,如XmlDocument类用于DOM树形式的操作,XmlTextReader类用于流方式的快速读取,以及其他的诸如XmlWriter、XmlValidatingReader等类。...
在解析XML时,可以使用`SchemaFactory`和`Validator`进行校验。 总之,这个压缩包提供的源码涵盖了XML解析的核心技术,包括DOM和SAX解析,以及可能的XML验证。理解并掌握这些知识对于任何商业编程项目都是至关重要...
这个HTML文件可能包含了JavaScript代码,利用DOMParser或其他XML解析库来校验XML文档。如果XML文档与DTD不匹配,校验过程会在第10行报告错误,这可能是因为元素缺失、属性值错误或元素顺序不当等问题。 PPT①至PPT...
这可以通过使用Java API for XML Validation (JAXB) 或者DOM解析器实现。JAXB允许你将XML Schema转换为Java类,这样在反序列化XML时,JAXB会自动进行数据校验。 引入Schema约束的好处包括: - 提高数据准确性:...
5. **校验Schema**:如果文档需要遵循特定的XML Schema(XSD),可以使用`xmlschema`库来验证文档是否符合规范。例如: ```python from xmlschema import XMLSchema xsd_schema = XMLSchema('schema.xsd') ...