2016-09-29 3 views
1

my questionの内線番号。 kjhughesの助けを借りてsoap xmlのためにxsdを出すことができました。今、私はcoldfusionテストページを使用してxsdにsoap xmlを渡したいが、このエラーが出る。

[エラー]:2:170:cvc-elt.1:要素 'soap:Envelope'の宣言が見つかりません。

私はなぜhereのxsdを検証することができるのだろうと思っていますが、私のcoldfusionテストページで検証できませんか? エラーを解決するにはどうすればよいですか?coldfusionでsoap xmlをxsdに渡すには?

は、以下の私は、ColdFusionでXMLVALIDATEは()名前空間をサポートしていないので、それがかもしれないと思う私のテストページ

<cfsavecontent variable="sXML"><?xml version="1.0" encoding="utf-8"?> 
 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
 
    <soap:Body> 
 
    <Cancel_OrderLine xmlns="http://tempuri.org/"> 
 
     <Data> 
 
     <Delivery> 
 
      <Delivery_No>1605000194</Delivery_No> 
 
      <Reason>qwertyu</Reason> 
 
     </Delivery> 
 
     <Delivery> 
 
      <Delivery_No>1605000194</Delivery_No> 
 
      <Reason>qwerty</Reason> 
 
     </Delivery> 
 
     </Data> 
 
    </Cancel_OrderLine> 
 
    </soap:Body> 
 
</soap:Envelope> 
 
</cfsavecontent> 
 

 
<cfset myResults = XMLValidate(sXML, "http://127.0.0.1:8501/test/schema/test_to_validate.xsd")> 
 

 
<cfoutput> 
 
    Did the sample xml validate against test_to_validate.xsd? #myResults.status#<br><br> 
 
</cfoutput> 
 

 
Dump of myResults structure returned by XMLValidate<br> 
 
<cfdump var="#myResults#">

答えて

0

です。私は前と同じ問題を抱えていました。私の同僚はxmlValidate関数を名前空間を含むようにする素晴らしいコードを書いていました。基本となるJavaには検証に名前空間を含めるオプションがあるようですが、ColdFusionではこのオプションが自動的に「false」に設定されます。だから、私の同僚が書いた関数はJavaに入り、そこでその検証を行います。

ここにある:

<cffunction name="cfValidateXML" access="public" output="false" returntype="struct"> 
    <cfargument name="xmlPath" required="true"> 
    <cfargument name="xsdPath" required="true"> 
    <cfset var returnStruct = structNew()> 
    <cfscript> 
     try { 
      /*Set up XML parser*/ 
      documentBuilderFactoryInstance = createobject("java","javax.xml.parsers.DocumentBuilderFactory").newInstance(); 
      /* Specify that the parser produced by this code provide support for XML namespaces. By default this value is false */ 
      documentBuilderFactoryInstance.setNamespaceAware(true); 
      parser = documentBuilderFactoryInstance.newDocumentBuilder(); 
      XMLfile = fileRead(xmlPath); 
      XSDfile = fileRead(xsdPath); 
      xmlStringRead = createobject("java","java.io.StringReader").init(XMLfile); 
      inputXMLSource = createobject("java","org.xml.sax.InputSource").init(xmlStringRead); 
      xsdStringRead = createobject("java","java.io.StringReader").init(XSDfile); 
      inputXSDSource = createobject("java","org.xml.sax.InputSource").init(xsdStringRead); 
      /* Parse an XML document into a DOM tree */ 
      document = parser.parse(inputXMLSource); 
      /* Create a SchemaFactory capable of understanding WXS schemas */ 
      factory = createobject("java","javax.xml.validation.SchemaFactory").newInstance(createobject("java","javax.xml.XMLConstants").W3C_XML_SCHEMA_NS_URI); 
      /* Load a WXS schema, represented by a Schema instance */ 
      schemaFile = createobject("java","javax.xml.transform.stream.StreamSource").init(xsdStringRead); 
      schema = factory.newSchema(schemaFile); 
      /* Create a Validator instance, and use it to validate an instance document */ 
      validator = schema.newValidator(); 
      domResult = validator.validate(createobject("java","javax.xml.transform.dom.DOMSource").init(document), createobject("java","javax.xml.transform.dom.DOMResult")); 
      returnStruct = { 
       status = true 
      }; 
      return returnStruct; 
     } 
     catch (any result) { 
      returnStruct = { 
       status = false, 
       errors = result 
      }; 
      return returnStruct; 
     } 
    </cfscript> 
</cffunction> 

注これは、XMLファイルとXSDパスへのパスを使用しますが、あなたはeasilly文字列にそれを変えることができること。

私は機能がごtestcodeに含まれているtryCF上のコードの断片を作成した:私はすべてのスキーマがに含まれていたファイルへのXSDパスを変更することができますhere

+0

は、あなたのコードをありがとう!例えば。 http://127.0.0.1:8501/test/schema/test_to_validate.xsd –

+0

私はコードでテストしましたが、私はDelivery_Noに非整数値を入れたり、Reason&Delivery_Noのシーケンスを交換しても検証することもできます。なぜそれが結果のためにfalseを返さなかったのですか? –

+0

@ chyman-91はいできます! – Sander

関連する問題