2014-10-11 70 views
2
Below is the code 


import java.io.File; 
    import java.io.IOException; 
import javax.xml.XMLConstants; 
    import javax.xml.transform.stream.StreamSource; 
    import javax.xml.validation.Schema; 
import javax.xml.validation.SchemaFactory; 
      import javax.xml.validation.Validator; 

    import org.xml.sax.SAXException; 


public class XMLValidation { 

public static void main(String[] args) { 

    System.out.println("request.xml validates agains xsd "+validateXMLSchema("request.xsd", "request.xml")); 
    } 

public static boolean validateXMLSchema(String xsdPath, String xmlPath){ 

    try { 
     SchemaFactory factory = 
       SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
     Schema schema; 
     try { 
      schema = factory.newSchema(new File(xsdPath)); 
      Validator validator = schema.newValidator(); 
       validator.validate(new StreamSource(new File(xmlPath))); 
     } catch (SAXException e) { 

      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      return false; 
     } 

    } 
    catch (IOException e) { 
     System.out.println("Exception: "+e.getMessage()); 

    } 
    return true; 
} 

下面是當我再次驗證請求XML,我得到的錯誤,請求XSD:無法解決org.xml.sax.SAXParseException:CVC-elt.1:找不到元素的聲明「soapenv:信封」

org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'soapenv:Envelope'. 
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195) 
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131) 
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384) 
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318) 
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:1887) 
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:685) 
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:400) 
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:626) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3088) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:914) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647) 
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:508) 
at  com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807) 
at       com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 
at   com.sun.org.apache.xerces.internal.jaxp.validation.StreamValidatorHelper.validate(StreamValidatorHelper.java:144) 
at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:107) 
at javax.xml.validation.Validator.validate(Validator.java:127) 
at com.att.xmlvalidation.XMLValidation.validateXMLSchema(XMLValidation.java:35) 
at com.att.xmlvalidation.XMLValidation.main(XMLValidation.java:23) 

能否請你幫我什麼是我的代碼所需要的變化,添加在我的XSD 因爲它標配,另外,肥皂我不能在XSD的任何變化: env在請求XSD中不存在,但存在於請求XML中,因此在驗證它時說該標記丟失。

回答

1

你有兩個選擇:

  1. 包括以驗證現有的架構SOAP模式(爲了進行模式驗證,您必須提供所有相關的架構)
  2. 地帶SOAP包裝器元素關閉有效載荷,並且只驗證有效載荷(假設您只有架構適用於有效載荷)。您可以使用參考有效負載Element而不是StreamSourceDOMSource
+0

感謝您的回覆。請給我們解釋一下上面2點的例子 – 2014-10-11 14:41:24

+0

@Sangeethacg - 哪個部分你有理解有困難? – jtahlborn 2014-10-11 14:52:13

+0

說實話,我對這兩點都不太瞭解。你可以請示例請求xsd和示例請求xml,並顯示什麼是確切的變化是必需的?我實際上是新的這個XML技術 – 2014-10-11 15:03:48

相關問題