2017-05-31 63 views
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)); 

回答

0

創建DocumentBuilder之前,請確保該schemaDocumentBuilderFactory設置。 schema對象是線程安全的,可以重用,沒有問題。

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