0
我需要XSD驗證XML。如果我使用xsd而沒有命名空間,那麼驗證是很好的。但是如果XSD有targetNamespace,我會得到錯誤。由xsd和xmlns進行Java驗證
文本錯誤:cvc-elt.1:找不到元素'RequestGKN'的聲明。
XML
<?xml version="1.0" encoding="utf-8" ?>
<RequestGKN
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="urn://x-artefacts-rosreestr-gov-ru/requests/gkn/3.0.9">
<title>123</title>
</RequestGKN>
XSD
<?xml version="1.0" encoding="utf-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn://x-artefacts-rosreestr-gov-ru/requests/gkn/3.0.9"
elementFormDefault="qualified">
<xs:element name="RequestGKN">
<xs:annotation>
<xs:documentation>root element</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="Title" type="xs:string">
<xs:annotation>
<xs:documentation>info</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Java代碼
Schema schema = null;
Document document = null;
xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" +
"<RequestGKN xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"urn://x-artefacts-rosreestr-gov-ru/requests/gkn/3.0.9\">" +
"<title>123</title>" +
"</RequestGKN>";
try {
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);
DocumentBuilder parser = builderFactory.newDocumentBuilder();
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = docFactory.newDocumentBuilder();
document = builder.parse(new InputSource(new StringReader(xml)));
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
path = locationXSD.substring(0, locationXSD.lastIndexOf('/')+1);
//factory.setResourceResolver(new ResourceResolver());
Source schemaFile = new StreamSource(TemplateHandler.class.getClassLoader().getResourceAsStream(locationXSD));
schema = factory.newSchema(schemaFile);
} catch (Exception e) {
e.printStackTrace();
}
Validator validator = schema.newValidator();
validator.validate(new DOMSource(document));