我在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());
}
}
答案 0 :(得分:2)
您的第一次尝试不起作用的可能原因之一是因为您使用的是不支持名称空间的DocumentBuilder
。默认情况下,DocumentBuilderFactory
创建的解析器不会识别名称空间。在创建DocumentBuilderFactory
之前,您应始终在DocumentBuilder
上启用名称空间支持。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder parser = factory.newDocumentBuilder();
如果没有命名空间支持,DocumentBuilder
构建的DOM将包含缺少localName
和namespaceURI
值的DOM Level 1节点(请参阅DOM FAQ)。这些是XML Schema验证器在搜索元素声明时将尝试从DOM读取的值。