没有命名空间的xml的Java xsd验证

Ale*_*mes 11 java xml validation xsd

我想针对XSD架构验证XML文件.XML文件根元素没有任何名称空间或xsi详细信息.它没有属性<root>.

我从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);
Run Code Online (Sandbox Code Playgroud)

xml通过包含的命名空间标头等(通过xmlspy添加)验证正常,但我认为可以声明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);
    }       
}
Run Code Online (Sandbox Code Playgroud)

xcu*_*cut 2

您有两个需要注意的问题:

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

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

<xml> ... </xml>
Run Code Online (Sandbox Code Playgroud)

和这个不一样

<xml xmlns="urn:foo"> ... </xml>
Run Code Online (Sandbox Code Playgroud)

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

  • xml文档是由第三方创建的,他们可能没有添加正确的命名空间,java中有没有一种方法可以在验证之前轻松地将此命名空间附加到根xml元素? (2认同)
  • 为此,您可以执行以下两件事: 1. 如果您知道自己在做什么并且格式相当静态或更好,则使用字符串操作插入它 2. 创建一个更改名称空间的 SAX 过滤器(请参阅 http://www .saxproject.org/filters.html),并将过滤器传递给验证器。我还没有尝试过使用 Validator 对象,但希望它能起作用。 (2认同)