【问题标题】:Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing Schema: can't import schema from 'http://schemas.xmlsoap.org/soap/encoding/'致命错误:未捕获的 SoapFault 异常:[WSDL] SOAP-ERROR: Parsing Schema: can't import schema from 'http://schemas.xmlsoap.org/soap/encoding/'
【发布时间】:2011-08-11 09:46:47
【问题描述】:
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing Schema: can't import schema from 'http://schemas.xmlsoap.org/soap/encoding/'

首先,很抱歉,我把这些问题放在这里会导致 stackoverflow 中有很多相同的问题。但它似乎不适合我。

我多次使用 Magento SOAP2 API,这个错误并不经常发生。但是当我今天运行我的脚本时,它总是犯一个致命的错误。

我已经查找了一些方法来解决这个问题,例如,一些文章告诉我在 /app/code/core/Mage/Api/etc/wsdl.xml 中更改此代码

<import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemalocation="http://schemas.xmlsoap.org/soap/encoding/">
</import> 

到这里

<!-- 
<import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="http://schemas.xmlsoap.org/soap/encoding/" />
-->  

我跟着这个,但它又犯了如下错误,

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing Schema: unexpected <import> in schema

然后我不知道出了什么问题,因为这个脚本总是运行完美,但今天我什至没有更改任何代码行。我的问题是, 1、有什么方法可以解决吗? 2、我能不能把这个xmlsoap.org xml文件放到本地主机或者我自己的服务器上,这样我的脚本就不会依赖我服务器上的文件了。

提前谢谢你!

【问题讨论】:

    标签: magento soap wsdl


    【解决方案1】:

    首先,请不要篡改任何 Magento API V2 WSDL 配置文件的默认元素。这是基本规则。

    请记住在每个自定义 WSDL 文件的开头写入以下元素,或确保在目标现有模块的 WSDL 文件的开头出现以下元素:-

    1. definition”元素(&lt;definitions&gt; - 开始标签)
    2. types”元素(&lt;types&gt; - 开始标签)
    3. schema”元素(&lt;schema&gt; - 开始标签)
    4. import”元素(&lt;import /&gt; - 单例标签,没有结束标签)

    然后您可以继续为该自定义模块定义 Magento API V2 的复杂数据类型。

    通过查看一些现有的 Magento API V2 WSDL 文件,您可以很好地了解所有这些概念。


    现在回到您的问题...

    1.有什么办法解决吗? 正如我之前所说,请在 WSDL 文件的开头保留上述元素定义。

    import”语句应该是:-
    &lt;import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="http://schemas.xmlsoap.org/soap/encoding/" /&gt;
    没有结束标签。 属性名称也是“schemaLocation”而不是“schemalocation”。请跟随骆驼套管。


    2。我可以将这个 xmlsoap.org xml 文件放到本地主机或我自己的服务器上,这样我的脚本就不会依赖于我服务器上的文件了吗?

    是的,你可以,但你需要知道并保持两个要点:-

    1. 根据 W3C 规范,“namespace”和“schemaLocation”属性都必须是 URI 类型。因此,这两个属性的本地文件也必须可以在本地浏览器中使用 HTTP 协议进行访问。
    2. 如果您在本地硬盘上维护它,那么您就忘记了升级的一条黄金法则,即 SOAP/1.1 编码文件的 Schema。这是因为如果(仅当)W3C 在同一个 URI 中升级此文件,那么如果提供了通用 URI,您的 Magento 将能够自动获取它;否则,您需要将升级后的文件再次下载到您的服务器。

    除了这两点之外,一切都很好,你可以开始了。


    不过,我希望我已经回答了您的所有问题。希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      使用类似的代码,

      //创建肥皂对象

      `$proxy = new SoapClient('http://localhost/magento/index.php/api/soap/?wsdl');`
      

      //使用api用户名和api key创建授权会话id

      $sessionId = $proxy->login('apiUser', 'apiKey');
      
      $productinfo = $proxy->call($sessionId, 'product.info',16);
      echo "<pre>";print_r($productinfo);
      

      【讨论】:

        【解决方案3】:

        只是一些可接受的解决方案的细节。

        1. 在浏览器中输入架构位置的地址:

          http://schemas.xmlsoap.org/soap/encoding/

        2. 将浏览器中的 XML 结果保存在名为 encoding.xsd 的文件中(另存为)。

        3. 将此文件复制到您的 magento Web 根目录,例如/var/www/magento/
        4. 在 magento 根文件夹中搜索 wsd*.xml 文件中的所有 schemaLocation 条目,例如
          find . -name "wsdl*.xml" | xargs grep schemaLocation 2&gt;/dev/null | grep org
          在我的系统上,./app/code/core 中有 12 个匹配文件,./app/code/local 中有 2 个来自 3rd 方扩展的匹配文件。
        5. 更改每个匹配的 xml 文件中的行
          <import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemalocation="http://schemas.xmlsoap.org/soap/encoding/">

          &lt;import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="../../../../encoding.xsd"&gt;

          备注:在这种情况下 encoding.xsd 文件比 http://sampleshop.com/testsystem/index.php/api/v2_soap/?wsdl 的 api 路径高 4 个目录
          在您的实时系统中,2(不带 index.php)或 3(带 in​​dex.php)次 "../" 可能是正确的。

        6. 尝试从本地和远程服务器调用 SOAP
          示例脚本
          <?php $proxy = new SoapClient('http://sampleshop.com/testsystem/index.php/api/v2_soap/?wsdl'); $sessionId = $proxy->login('MagentoSoapUser', 'SoapApiKey'); $result = $proxy->directoryCountryList($sessionId); var_dump($result); ?>
          这个解决方案对我有用,只是想添加一些细节,因为它需要一些时间才能运行。
          系统:magento CE 1.7.0.2
          SOAP:php- soap在magento服务器上使用php 5.3版,在远程服务器上使用5.6版。

        光头

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多