我已经用Java编写了一个代码来针对xsd模式验证xml文件。尽管在线验证器返回肯定结果,但Java中的验证器仍然失败。请从xml / xsd文件中找到以下代码片段:

XML:

<?xml version = "1.0" encoding = "UTF-8"?>
<ns0:Root xmlns:ns0 = "URLA">
    <ns0:DigitalAsset>


...
XSD:

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
     xmlns="URLA"
     targetNamespace="URLA"
     elementFormDefault="qualified"
     attributeFormDefault="unqualified">
    <xs:import namespace="http://www.w3.org/XML/1998/namespace"/>
    <xs:element name="Root">


错误:cvc-elt.1.a:找不到元素'ns0:Root'的声明

Java代码:

@Test
    public void testXmlStructure(){
        try {
            DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            Document document = parser.parse(new File("./resources/2449346_20151007_ProductTaxonomy.xml"));

            SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

            Source schemaFile = new StreamSource(new File("./resources/Schema.xsd"));
            Schema schema = factory.newSchema(schemaFile);

            Validator validator = schema.newValidator();

            validator.validate(new DOMSource(document));

            } catch (IOException e){
                Assert.fail(e.getMessage());
            } catch(SAXException e1){
                    Assert.fail(e1.getMessage());
            } catch (ParserConfigurationException e) {
                // TODO Auto-generated catch block
                Assert.fail(e.getMessage());
            }

    }


不幸的是,这些数据是敏感的。我将尝试用一些虚拟元素替换它并发布它。

非常感谢您的建议。

编辑:

你知道吗?我将代码更改为以下内容,并且可以正常工作:

@Test
    public void testXmlStructure(){
        try {

            Source xmlFile = new StreamSource(new File("./resources/2449346_20151007_ProductTaxonomy.xml"));

            SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

            Source schemaFile = new StreamSource(new File("./resources/Schema.xsd"));
            Schema schema = factory.newSchema(schemaFile);

            Validator validator = schema.newValidator();

            validator.validate(xmlFile);

            } catch (IOException e){
                Assert.fail(e.getMessage());
            } catch(SAXException e1){
                    Assert.fail(e1.getMessage());
            }
    }

最佳答案

首次尝试不起作用的可能原因之一是,因为您使用的是不支持名称空间的DocumentBuilder。默认情况下,由DocumentBuilderFactory创建的解析器将不支持名称空间。创建DocumentBuilderFactory之前,应始终在DocumentBuilder上启用名称空间支持。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder parser = factory.newDocumentBuilder();


如果没有名称空间支持,则由DocumentBuilder构建的DOM将包含DOM Level 1节点,这些节点缺少其localNamenamespaceURI的值(请参见DOM FAQ)。这些是XML Schema验证程序在搜索元素声明时将尝试从DOM读取的值。

关于java - cvc-elt.1.a:找不到元素'ns0:Root'的声明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34876820/

10-10 14:07