2012-01-23 126 views
5

我一直在找周圍的網現在的好幾個小時,試圖找到一種簡單的方法來驗證對一個WSDL完整的SOAP消息WSDL SOAP消息。我意識到有很多方法可以用各種Web服務框架來完成這項工作,但我不想這樣做,因爲要求只是驗證一段XML。我可以根據模式進行驗證,但是我遇到的問題是有很多模式導入到WSDL中,我不知道應該對哪個模式進行驗證。我可以寫一些工具來第一個進程的WSDL和響應,以確定XSD來驗證它,但我用規定的庫推測,這可能是一個班輪做!驗證針對多個XSD的

有誰知道一個相對簡單的方法來驗證給定WSDL和XSD多的XML文檔?

回答

4

在以前的項目中,我通過解析WSDL文件,並從中提取模式解決了這個問題。該代碼是類似於下面的東西,它假定WSDL已經被讀入以某種方式源變量「wsdlSource」和導入的命名空間中的「模式」 - 元素聲明。將它在啓動時執行一次然後在SOAPHandler中進行驗證可能是一個好主意。

//First create a document from the WSDL-source 
    DocumentBuilder db = DocumentBuilderFactory.newInstance() 
       .newDocumentBuilder(); 
    Document wsdlDoc = db.newDocument(); 

    TransformerFactory transformerFactory = TransformerFactory 
       .newInstance(); 
    Transformer transformer = transformerFactory.newTransformer(); 
    transformer.transform(wsdlSource, new DOMResult(wsdlDoc)); 

    //Now get the schemas from the WSDL 
    NodeList schemaNodes = wsdlDoc.getElementsByTagNameNS(
      XMLConstants.W3C_XML_SCHEMA_NS_URI, "schema"); 

    int nrSchemas = schemaNodes.getLength(); 

    Source[] schemas = new Source[nrSchemas]; 

    for (int i = 0; i < nrSchemas; i++) { 
     schemas[i] = new DOMSource(schemaNodes.item(i)); 
    } 

    SchemaFactory schemaFactory = SchemaFactory 
      .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 

    //Now we have a schema that can validate the payload 
    Schema schema = schemaFactory.newSchema(schemas); 
    Validator validator = schema.newValidator(); 
+0

看起來像現在唯一的方法!感謝您的摘錄。 – Ellis

0

沒有這樣做直接的方式。沒有我可以找到的開源庫。我在IBM Info領域使用了XML Pack工具來執行此操作。這對於導入wsdls和xsds以及驗證xml數據或加載XML數據並將其轉換爲平面文件做得相當不錯。您可能會發現此鏈接有用:http://www.ibm.com/developerworks/data/library/techarticle/dm-1103datastages/index.html

+0

感謝您的答覆,但我不認爲這會給出飛什麼我試圖做的,是簡化目前採用的是完全成熟的框架,以驗證SOAP消息 – Ellis

+0

實用這是一個不我們已經使用過的庫:http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi/index.html在我們當前的實現中。 – codegenx

+0

我沒有看到關於在該頁面上驗證WSDL的任何內容。 – Ellis