2017-05-31 3 views
0

Ich brauche validieren XML von XSD. Wenn ich xsd ohne Namespace verwende, ist Validate gut. Aber wenn XSD targetNamespace habe, erhalte ich einen Fehler.Java Validierung von xsd mit xmlns

Textfehler: cvc-elt.1: Die Deklaration des Elements 'RequestGKN' konnte nicht gefunden werden.

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-Code

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)); 

Antwort

0

Vor DocumentBuilder erstellen, stellen Sie sicher, dass die schema in DocumentBuilderFactory gesetzt. Das schema Objekt ist threadsicher und kann problemlos wiederverwendet werden.

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
String path = locationXSD.substring(0, locationXSD.lastIndexOf('/')+1); 
Source schemaFile = new StreamSource(TemplateHandler.class.getClassLoader().getResourceAsStream(locationXSD)); 
schema = factory.newSchema(schemaFile);//thread safe object which can be reused 

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 
builderFactory.setNamespaceAware(true); 
builderFactory.setSchema(schema); 
DocumentBuilder builder = builderFactory.newDocumentBuilder(); 
document = builder.parse(new InputSource(new StringReader(xml))); 

Validator validator = schema.newValidator(); 
validator.validate(new DOMSource(document));