我已经用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节点,这些节点缺少其localName
和namespaceURI
的值(请参见DOM FAQ)。这些是XML Schema验证程序在搜索元素声明时将尝试从DOM读取的值。关于java - cvc-elt.1.a:找不到元素'ns0:Root'的声明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34876820/