`
JAVA天地
  • 浏览: 676691 次
  • 性别: 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-->
分享到:
评论

相关推荐

    XSD使用dom4j校验XML

    DOM4J提供了一种简单的方法来加载XML和XSD文件,然后使用Schema类进行校验。以下是一个基本的步骤概述: 1. 加载XSD文件:使用DOM4J的DocumentHelper类的parse方法,传入XSD文件的路径,得到一个SchemaFactory对象...

    Java通过XML Schema校验XML

    在本例中,作者选择使用DOM4j库来进行XML的解析与校验,并且结合了javax.xml.parsers包中的SAXParser来实现XML与XSD之间的校验。这种方法相对直观且易于理解。 #### 示例代码详解 首先,我们来看一下示例中给出的...

    Schema校验java

    在Java中实现XML Schema校验,我们可以使用Java API for XML Processing (JAXP) 提供的工具,特别是SAX或者DOM解析器。SAX解析器是事件驱动的,它逐行解析XML文档并触发相应的事件,如遇到元素开始、元素结束等,...

    schema校验所需要的jar包

    2. **dom4j-1.6.1.jar**:这是一个流行的Java XML处理库,提供了DOM、SAX和JDOM等多种接口来操作XML文档。它支持XML Schema,可以帮助解析和构建XML文档,并进行schema校验。 3. **isorelax-20050913.jar**:ISO ...

    xml的JAVA解析与格式定义

    例如,你可以使用`javax.xml.parsers.DocumentBuilderFactory`和`javax.xml.parsers.DocumentBuilder`创建DOM解析器,然后调用`parse()`方法解析XML文件。DOM解析适用于小型或中型XML文件,因为大型文件可能导致内存...

    schema_xml.rar_vc xml

    &lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"&gt; &lt;/xs:schema&gt; ``` 上述XSD规定了一个名为"person"的元素,它包含两个子元素:"firstName"和"lastName",两者都必须是字符串类型。 接...

    xmlValidate.rar

    XML文档的结构严谨,为了确保其正确性和有效性,通常会使用XML校验工具来验证XML文档是否符合预定义的XML Schema(XSD)规范。"xmlValidate.rar" 是一个压缩包,包含了XML校验相关的工具和资源,便于用户进行XML报文...

    操作XML方法大全

    - 验证XML文档:使用XML Schema Definition (XSD) 文件对XML进行校验,确保其符合预定义的规则。 7. **Namespaces**: - 在XML中,命名空间用于区分相同名称的元素和属性,通过前缀和URI(Uniform Resource ...

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

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

    xml约束 xml经典之二

    可以使用XML解析器,如Microsoft.XMLDOM(在IE5及以上版本的浏览器中内置),来加载XML文件并进行DTD验证。在JavaScript中,可以通过创建XML文档解析器对象,开启校验,然后加载XML文件,最后检查解析错误来实现这个...

    vtd-xml vtd-xml vtd-xml

    DOM解析器会将整个XML树加载到内存中,占用大量资源;SAX是事件驱动的,适合流式处理,但不支持随机访问。而VTD-XML则兼顾了随机访问和资源效率。 6. **应用场景**:VTD-XML适用于大数据分析、XML文档的索引和搜索...

    xml解析工具-静态分析.rar

    4. **解析器**:XML解析器负责读取XML文档并将其转化为程序可以处理的数据结构。有DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)等解析方式: - **DOM**:将整个XML...

    XML开发库对比

    TinyXml是一个轻量级的DOM解析库,主要适用于嵌入式系统或对内存使用有严格限制的项目。它不支持XML文档验证,但提供了方便的API来读写XML文档,使得操作XML结构变得直观。 4. XML4C: XML4C是IBM开发的XML解析库...

    XML考试题库大全

    XML 文档可以通过 DTD 或 XML Schema 的校验来确保其合法性。XML 文档的合法性是保证 XML 文档正确性的一个重要方面。 本资源摘要信息涵盖了 XML 技术及应用的相关知识点,包括 XML 文档的结构定义、编程接口、文档...

    C++ xml文件处理介绍

    在C++中处理XML文件,主要依赖于.NET框架提供的这些命名空间中的类和方法,如XmlDocument类用于DOM树形式的操作,XmlTextReader类用于流方式的快速读取,以及其他的诸如XmlWriter、XmlValidatingReader等类。...

    商业编程-源码-介绍两个 XML 文件操作类.zip

    在解析XML时,可以使用`SchemaFactory`和`Validator`进行校验。 总之,这个压缩包提供的源码涵盖了XML解析的核心技术,包括DOM和SAX解析,以及可能的XML验证。理解并掌握这些知识对于任何商业编程项目都是至关重要...

    第135讲phpxml编程②cdata实体字符处理指令dtd快速入门编程校验xml.pdf

    这个HTML文件可能包含了JavaScript代码,利用DOMParser或其他XML解析库来校验XML文档。如果XML文档与DTD不匹配,校验过程会在第10行报告错误,这可能是因为元素缺失、属性值错误或元素顺序不当等问题。 PPT①至PPT...

    JavaWeb开发技术-引入Schema约束.pptx

    这可以通过使用Java API for XML Validation (JAXB) 或者DOM解析器实现。JAXB允许你将XML Schema转换为Java类,这样在反序列化XML时,JAXB会自动进行数据校验。 引入Schema约束的好处包括: - 提高数据准确性:...

    基于Python的DOM质量检查技术研究.zip

    5. **校验Schema**:如果文档需要遵循特定的XML Schema(XSD),可以使用`xmlschema`库来验证文档是否符合规范。例如: ```python from xmlschema import XMLSchema xsd_schema = XMLSchema('schema.xsd') ...

Global site tag (gtag.js) - Google Analytics