如何用多个schema文件验证一个xml文件?

OSC_代码审查官 发布于 2013/05/23 20:16
阅读 1K+
收藏 1
现在有七个相互关联的schema文件,我想用这几个文件来验证一个xml文件的是否符合规则,在网上找到一种方法但老是不对!!!
package net.aidingwei.util;

import java.io.*;

import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import org.xml.sax.SAXException;

public class xmlValidation {

    /**
     * @功能描述 TODO
     * @创建人  - 017
     * @创建时间 2013-5-23 下午5:58:38
     * @param args
     * @throws SAXException
     * @throws IOException
     */
    public static void main(String[] args) throws SAXException, IOException {

        // 1. Specify you want a factory for RELAX NG
        SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");

        // 2. Load the specific schema you want.
        // Here I load it from a java.io.File, but we could also use a
        // java.net.URL or a javax.xml.transform.Source

        File CDAFile = new File("F:\\test\\schema\\sdschemas\\CDA.xsd");
        File PCHISFile = new File("F:\\test\\schema\\sdschemas\\PCHIS.xsd");
        File POCDFile = new File("F:\\test\\schema\\sdschemas\\POCD_MT000040.xsd");
        File datatypesFile = new File("F:\\test\\schema\\CoreSchemas\\datatypes.xsd");
        File datatypesBaseFile = new File("F:\\test\\schema\\CoreSchemas\\datatypes-base.xsd");
        File NarrativeBlockFile = new File("F:\\test\\schema\\CoreSchemas\\NarrativeBlock.xsd");
        File vocFile = new File("F:\\test\\schema\\CoreSchemas\\voc.xsd");
        Source[] source = { 
                new StreamSource(CDAFile), 
                new StreamSource(PCHISFile), 
                new StreamSource(POCDFile),
                new StreamSource(datatypesFile), 
                new StreamSource(datatypesBaseFile),
                new StreamSource(NarrativeBlockFile), 
                new StreamSource(vocFile)
                };

        // 3. Compile the schema.
        Schema schema = factory.newSchema(source);

        // 4. Get a validator from the schema.
        Validator validator = schema.newValidator();

        // 5. Parse the document you want to check.
        String input = "F:\\test\\201305\\0721ee956c104d32a72beb052bd529d6.xml";

        Source source2 = new StreamSource(input);

        // 6. Check the document
        try {
            validator.validate(source2);
            System.out.println(input + " is valid.");
        } catch (SAXException ex) {
            System.out.println(input + " is not valid because ");
            System.out.println(ex.getMessage());
        }
    }
}


总是报错
Exception in thread "main" org.xml.sax.SAXParseException: rcase-Recurse.2: There is not a complete functional mapping between the particles.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
    at com.sun.org.apache.xerces.internal.impl.xs.XSConstraints.reportSchemaError(XSConstraints.java:276)
    at com.sun.org.apache.xerces.internal.impl.xs.XSConstraints.fullSchemaChecking(XSConstraints.java:405)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:530)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:489)
    at com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory.newSchema(XMLSchemaFactory.java:224)
    at net.aidingwei.util.xmlValidation.main(xmlValidation.java:47)
加载中
0
OSC_代码审查官
OSC_代码审查官
这么多阅,就没人给点指导么?
0
灰花走湿
灰花走湿
建议首先测试下单个xsd文件能否正确验证,瘦减下结构,看看怎么样,是否仍然报错?
0
OSC_代码审查官
OSC_代码审查官

引用来自“yaoyaolingma”的答案

建议首先测试下单个xsd文件能否正确验证,瘦减下结构,看看怎么样,是否仍然报错?
验证出了是这个错误,不是很懂啊!!!
Sam_yi
Sam_yi
好像你的schema 都没有验证通过 ,你怎么用来validate 你的XML
0
灰花走湿
灰花走湿

引用来自“半个朋友”的答案

引用来自“yaoyaolingma”的答案

建议首先测试下单个xsd文件能否正确验证,瘦减下结构,看看怎么样,是否仍然报错?
验证出了是这个错误,不是很懂啊!!!
我大致看了你的代码,可能和你的xsd文件有关系,如果单文件也无法验证通过,那就不是多个xsd的问题了,继续测试下xsd文件吧,逐个排除问题
0
OSC_代码审查官
OSC_代码审查官

引用来自“yaoyaolingma”的答案

引用来自“半个朋友”的答案

引用来自“yaoyaolingma”的答案

建议首先测试下单个xsd文件能否正确验证,瘦减下结构,看看怎么样,是否仍然报错?
验证出了是这个错误,不是很懂啊!!!
我大致看了你的代码,可能和你的xsd文件有关系,如果单文件也无法验证通过,那就不是多个xsd的问题了,继续测试下xsd文件吧,逐个排除问题
我用自己写的xsd文件和xml文件验证过这个方法,是可行的,但客户弄死都说他的xsd文件没问题!!!忧伤了!!!
0
灰花走湿
灰花走湿

引用来自“半个朋友”的答案

引用来自“yaoyaolingma”的答案

引用来自“半个朋友”的答案

引用来自“yaoyaolingma”的答案

建议首先测试下单个xsd文件能否正确验证,瘦减下结构,看看怎么样,是否仍然报错?
验证出了是这个错误,不是很懂啊!!!
我大致看了你的代码,可能和你的xsd文件有关系,如果单文件也无法验证通过,那就不是多个xsd的问题了,继续测试下xsd文件吧,逐个排除问题
我用自己写的xsd文件和xml文件验证过这个方法,是可行的,但客户弄死都说他的xsd文件没问题!!!忧伤了!!!
分析下这个xsd实现的作用,从你的截图来看,就已经在这里报出错误了
返回顶部
顶部