没有命名空间的xml的Java xsdvalidation

我想针对XSD架构validationXML文件。 XML文件根元素没有任何名称空间或xsi详细信息。 它没有属性,只有

我已经尝试了以下代码来自http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.html而没有运气,因为我收到cvc-elt.1: Cannot find the declaration of element 'root'

 SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); File schemaFile = new File("schema.xsd"); Schema xsdScheme = factory.newSchema(schemaFile); Validator validator = xsdScheme.newValidator(); Source source = new StreamSource(xmlfile); validator.validate(source); 

xml使用包含的命名空间头文件(通过xmlspy添加)validation正常,但我认为可以声明xml命名空间而无需手动编辑源文件?

编辑和解决方案:

 public static void validateAgainstXSD(File file) { try { SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); File schemaFile = new File("path/to/xsd"); Schema xsdScheme = factory.newSchema(schemaFile); Validator validator = xsdScheme.newValidator(); SAXSource source = new SAXSource( new NamespaceFilter(XMLReaderFactory.createXMLReader()), new InputSource(new FileInputStream(file))); validator.validate(source,null); } catch (Exception e) { e.printStackTrace(); } } protected static class NamespaceFilter extends XMLFilterImpl { String requiredNamespace = "namespace"; public NamespaceFilter(XMLReader parent) { super(parent); } @Override public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException { if(!arg0.equals(requiredNamespace)) arg0 = requiredNamespace; super.startElement(arg0, arg1, arg2, arg3); } } 

您需要注意两个独立的问题:

  1. 声明文档使用的命名空间。
  2. 在文件中放置一个xsi:schemaLocation属性,以提供架构所在的提示(!)

您可以安全地跳过第二部分,因为该位置实际上只是一个提示。 你不能跳过第一部分。 XML文件中声明的名称空间与模式匹配。 重要的是,这个:

  ...  

不一样

  ...  

因此,您需要在XML文档中声明您的命名空间,否则它将与您的架构不对应,您将收到此错误。