当前位置: 首页 > 知识库问答 >
问题:

在Java根据XSD 1.1验证XML时出错

何玉韵
2023-03-14

我试图在Java验证XSD1.1中的XML。正如所讨论的,如何在Java根据XSD1.1验证XML?

我有个例外说:

java.lang.IllegalArgumentException:无法加载实现http://www.w3.org/xml/xmlschema/v1.1指定的架构语言的SchemaFactory

然后我尝试schemafactory.setproperty(“http://saxon.sf.net/feature/xsd-version”,“1.1”),错误是:

无法从类型SchemaFactory对非静态方法setProperty(String,Object)进行静态引用

这些罐子我包括仍然没有改变错误。

java-cup-10k.jar

org.eclipse.wst.xml.xpath2.processor-2.1.100.jar

xercesImpl-2.11.0.jar

xml-apis-xerces-2.7.1.jar

任何一个都可以帮助我根据Java的XSD1.1验证XML?

import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Schema;
import javax.xml.XMLConstants;
import javax.xml.transform.sax.SAXSource;
import org.xml.sax.InputSource;
import javax.xml.validation.Validator;
import java.io.*;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.ErrorHandler;
class Xsd11SchemaValidator {
  private static int errorCount = 0;
  public static void main(String[] a) {
    if (a.length<2) {
      System.out.println("Usage:");
      System.out.println("java Xsd11SchemaValidator schema_file_name "
        + "xml_file_name");
    } 
      String schemaName ="C:\\Ankit\\tempFiles\\test1.xsd";
      String xmlName ="C:\\Ankit\\tempFiles\\test1.xml";
      Schema schema = loadSchema(schemaName);
      validateXml(schema, xmlName);

  }
  public static void validateXml(Schema schema, String xmlName) {
    try {
      // creating a Validator instance
      Validator validator = schema.newValidator();

      // setting my own error handler
      validator.setErrorHandler(new MyErrorHandler());

      // preparing the XML file as a SAX source
      SAXSource source = new SAXSource(
        new InputSource(new java.io.FileInputStream(xmlName)));

      // validating the SAX source against the schema
      validator.validate(source);
      System.out.println();
      if (errorCount>0) {
        System.out.println("Failed with errors: "+errorCount);
      } else {
        System.out.println("Passed.");
      } 

    } catch (Exception e) {
      // catching all validation exceptions
      System.out.println();
      System.out.println(e.toString());
    }
  }
  public static Schema loadSchema(String name) {
    Schema schema = null;
    try {

这里我需要帮助

//      String language = XMLConstants.W3C_XML_SCHEMA_NS_URI;
      String language = "http://www.w3.org/XML/XMLSchema/v1.1";
      SchemaFactory.setProperty("http://saxon.sf.net/feature/xsd-version", "1.1");
      SchemaFactory factory = SchemaFactory.newInstance(language);


      schema = factory.newSchema(new File(name));
    } catch (Exception e) {
      System.out.println(e.toString());
    }
    return schema;
  }
  private static class MyErrorHandler implements ErrorHandler {
    public void warning(SAXParseException e) throws SAXException {
       System.out.println("Warning: "); 
       printException(e);
    }
    public void error(SAXParseException e) throws SAXException {
       System.out.println("Error: "); 
       printException(e);
    }
    public void fatalError(SAXParseException e) throws SAXException {
       System.out.println("Fattal error: "); 
       printException(e);
    }
    private void printException(SAXParseException e) {
      errorCount++;
      System.out.println("   Line number: "+e.getLineNumber());
      System.out.println("   Column number: "+e.getColumnNumber());
      System.out.println("   Message: "+e.getMessage());
      System.out.println();
    }
  }
}

共有1个答案

严劲
2023-03-14
SchemaFactory.setProperty("http://saxon.sf.net/feature/xsd-version","1.1");
SchemaFactory factory = SchemaFactory.newInstance(language);

需要更改为:

SchemaFactory factory = SchemaFactory.newInstance(language);
factory.setProperty("http://saxon.sf.net/feature/xsd-version", "1.1");
 类似资料:
  • 我正在尝试使用SAX解析和验证SOAP请求。需要两个XSD,一个用于SOAP信封(http://schemas.xmlsoap.org/soap/envelope/),另一个用于我定义的。我找不到针对这两个XSD正确验证请求的方法。 下面是我用来解析请求并根据soapenv验证它的代码。xsd。它工作得很好。如果改为指定XSD,验证将失败,并显示“找不到元素‘soapenv:Envelope’的声

  • 谁能解释一下如何使用notepad++根据XSD验证xml文件。“XML Tools”插件下拉列表中没有提供指定XSD文件的选项。在plugins子目录中正确安装XML插件,并将3个DLL复制到notepad++EXE子目录。其他XML“验证”特性也可以工作,但无法针对XSD进行验证。

  • 我正在创建一个XML验证器,它将根据特定的模式验证XML。我当前正在使用OASIS模式验证针对该模式的断言。下面是模式,当它被传递给SchemaFactory并且模式对象被创建时,xenc:encryptedData元素未被解析,该元素存在于导入的模式xenc-schema.xsd中。“ 并且当我创建SchemaFactory的实例并尝试加载模式时,它无法定位在上述模式中导入的模式: 当创建模式对

  • 问题内容: 我正在生成一些XML模式,并希望确保我们的生成器正在创建有效的XML模式文档(不是XML)。我试图提出验证XML Schema文档的代码,但失败了。我不认为会这么复杂。 这段代码与我需要做的非常接近,但是出现以下错误。 我在调用setSchema(uri)时使用URL,以确保XMLSchema.dtd和datatypes.dtd是相对的,希望它们可用,但是我不确定如何进行检查。 我猜想

  • 问题内容: 我需要针对验证SOAP消息。(以可以根据模式验证文件的方式)。 我没有打电话给任何网络服务;我只有一条消息和一个,并且我需要验证该消息是正确的。而无需调用网络服务或之后的任何服务。 我需要在Java程序中对此进行验证。您知道一个小的Java库可以做到这一点吗? ps:我知道当您调用Web服务时,有几个库可以验证请求/响应。但是,我没有调用任何Web服务。我有一个简单的消息,还有一个,并

  • 这是要根据模式验证的JSON。 问题是,如果我们传递了错误的数据,它将正确地验证eid和ename的类型(即整数或字符串)。对于例如: 如果我们为限定传递了错误的类型,那么它将验证为true(即,它不验证限定的类型,可能是因为它是嵌套的)。