Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java(IDE-Eclipse)中使用RELAXNG模式验证xml文件_Java_Xml - Fatal编程技术网

在Java(IDE-Eclipse)中使用RELAXNG模式验证xml文件

在Java(IDE-Eclipse)中使用RELAXNG模式验证xml文件,java,xml,Java,Xml,我一直在尝试根据名为bookNewRelax.rnc的.rnc文件验证xml文件bookNew.xml 我经常面临的错误是-- 线程“main”java.lang.IllegalArgumentException中出现异常:无法加载实现由指定的架构语言的SchemaFactory 位于javax.xml.validation.SchemaFactory.newInstance(未知源) 位于testRelax.main(testRelax.java:38) 为了防止出现这种情况,我在实例化Sch

我一直在尝试根据名为bookNewRelax.rnc的.rnc文件验证xml文件bookNew.xml

我经常面临的错误是--

线程“main”java.lang.IllegalArgumentException中出现异常:无法加载实现由指定的架构语言的SchemaFactory 位于javax.xml.validation.SchemaFactory.newInstance(未知源) 位于testRelax.main(testRelax.java:38)

为了防止出现这种情况,我在实例化SchemaFactory类的对象之前使用了一行代码,我认为这有助于解决这个问题。代码的名称如下所示:-

System.setProperty(SchemaFactory.class.getName() + ":" + XMLConstants.RELAXNG_NS_URI, "com.thaiopensource.relaxng.jaxp.CompactSyntaxSchemaFactory"); 
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.RELAXNG_NS_URI); 
我已经在我的项目中包含了外部jar-jing.jar,但是仍然会抛出相同的异常

我还导入了库com.thaiopensource.*;它的黄色下划线表示它从未被使用过。就我个人而言,我认为,这是jar文件在这里起了破坏作用,否则为什么thaiopensource库永远不会被使用呢

我正在下面粘贴java文件

导入java.io.*; 导入java.lang.management.ManagementFactory; 导入java.lang.management.ThreadMXBean

导入javax.xml.xmlstants; 导入javax.xml.parsers.DocumentBuilder; 导入javax.xml.parsers.DocumentBuilderFactory; 导入javax.xml.parsers.parserConfiguration异常; 导入javax.xml.transform.dom.DOMSource; 导入javax.xml.validation.*

导入org.w3c.dom.Document; 导入org.xml.sax.SAXException

导入com.thaiopensource.*

公共类testRelax{

/** Get CPU time in nanoseconds. */
public static long getCpuTime( ) {
    ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
    return bean.isCurrentThreadCpuTimeSupported( ) ?
        bean.getCurrentThreadCpuTime( ) : 0L;
}

/** Get user time in nanoseconds. */
public static long getUserTime( ) {
    ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
    return bean.isCurrentThreadCpuTimeSupported( ) ?
        bean.getCurrentThreadUserTime( ) : 0L;
}



public static void main(String args[]) throws SAXException, IOException, ParserConfigurationException {

    System.setProperty(SchemaFactory.class.getName() + ":" + XMLConstants.RELAXNG_NS_URI, "com.thaiopensource.relaxng.jaxp.CompactSyntaxSchemaFactory"); 
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.RELAXNG_NS_URI); 

    File schemaLocation = new File("C:/Users/gp85943/workspace/TestBookRelax/src/bookNewRelax.rnc");
    Schema schema = factory.newSchema(schemaLocation);
    Validator validator = schema.newValidator();

    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
    domFactory.setNamespaceAware(true);
    DocumentBuilder builder = domFactory.newDocumentBuilder();
    File file=new File("C:/Users/gp85943/workspace/TestBookRelax/src/bookNew.xml");


    try{

        long startTime = System.currentTimeMillis();
        System.out.println("Milli"+startTime);
        long startUserTimeNano   = getUserTime( );
        System.out.println("Nano"+startUserTimeNano);
        long startCPUTimeNano   = getCpuTime( );
        System.out.println("Nano"+startCPUTimeNano);

        Document doc = builder.parse(new File("C:/Users/gp85943/workspace/TestBookRelax/src/bookNew.xml"));
        DOMSource source = new DOMSource(doc);

        validator.validate(source);

        long stopTime = System.currentTimeMillis();
        System.out.println("MilliStop"+stopTime);
        long elapsedTime = stopTime - startTime;
        System.out.println("Elapsed time"+elapsedTime);
        //System.out.println("getUserTime--->"+getUserTime());
        //System.out.println("getCpuTime--->"+getCpuTime());
        //System.out.println("startUserTimeNano--->"+startUserTimeNano);
        //System.out.println("startCPUTimeNano--->"+startCPUTimeNano);
        long taskUserTimeNano    = getUserTime( ) - startUserTimeNano;
        System.out.println("User"+taskUserTimeNano);
        long taskCpuTimeNano    = getCpuTime( ) - startCPUTimeNano;
        System.out.println("CPU"+taskCpuTimeNano);
        System.out.println(file + " The document is valid");


    }

    catch(SAXException ex)
    {
        System.out.println("the document is not valid because--");
        System.out.println(ex.getMessage());
    }
}
}


请告诉我如何让我的java程序“接受”RELAXNG紧凑模式(或者简单地说.rng也可以),以便进行适当的验证。谢谢你的期待

通过SchemaFactory实现RELAXNG验证不需要Java实现。因此,即使它在一个环境中工作,它也是不可移植的。从错误消息中,您的特定Java实现似乎不支持它


因为您有Jing库,所以可以使用它们进行验证-请参阅开始时的文档。

我也有同样的问题,结果是我在类路径中缺少了Jing-20091111.jar

我一直在使用一些类装入器机制,所以如果我在代码中使用它们,那么所有的类都是可用的。问题是SchemaFactory不知道我的类加载器,所以我不得不将jar直接放在类路径中


所以我认为alexbrn关于特定Java实现支持的回答是错误的。当System.setProperty()用于提供RELAXNG的实现时,它应该在每个JVM中都能工作。

这段代码的一半似乎与您所问的问题无关。请更新您的问题以删除它。使用Jing API中的ValidationDriver解决了它。干杯谢谢你alexbrn,非常感谢你。那个文档真的很有用。Jing和RELAXNG。。。他们。。。他们只是工作!非常感谢你让我意识到他们的存在!我终于可以依赖我的XML文件了。。。