致命错误:未捕获的SoapFault异常:[WSDL] SOAP-ERROR:解析架构:无法从'http://schemas.xmlsoap.org/soap/encoding/'导入架构

时间:2011-08-11 09:46:47

标签: magento soap wsdl

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文件创建到localhost或我自己的服务器,以便我的脚本不依赖于我的服务器上的文件。

提前谢谢!

3 个答案:

答案 0 :(得分:2)

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

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

  1. definition”元素(<definitions> - 开始标记)
  2. types”元素(<types> - 开始标记)
  3. schema”元素(<schema> - 开始标记)
  4. import”元素(<import /> - 单例标记,没有结束标记)
  5. 然后,您可以继续为该自定义模块定义Magento API V2的复杂数据类型。

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


    现在回到你的问题......

    <强> 1。有什么方法可以解决吗? 正如我之前所说,请在WSDL文件的开头维护上述元素定义。

    import”声明应该是: - <import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="http://schemas.xmlsoap.org/soap/encoding/" />
    没有结束标记。 此外,属性名称为“schemaLocation”&amp;不是“schemalocation”。请关注Camel Casing。


    <强> 2。我可以将此xmlsoap.org xml文件发送到localhost或我自己的服务器,以便我的脚本不依赖于我的服务器上的文件吗?

    是的,你可以,但你需要知道&amp;保持两个关键点: -

    1. 两个属性“namespace”&amp;根据W3C规范,“schemaLocation”必须是URI类型。因此,必须使用HTTP协议在本地浏览器中访问这两个属性的本地文件。
    2. 如果要将其保存在本地硬盘中,那么对于SOAP / 1.1编码文件的Schema,您忘记了一个升级的黄金法则。这是因为如果(仅当)W3C在同一个URI中升级此文件,那么如果提供了一般URI,您的Magento将能够自动获取它;否则,您需要再次将升级后的文件下载到服务器。
    3. 除了这两个要点外,一切都还可以。你很高兴。


      尽管如此,我希望我已经回答了你的所有疑问。希望它有所帮助。

答案 1 :(得分:0)

使用代码,

//创建肥皂对象

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

//使用api用户名和api密钥创建授权会话ID

$sessionId = $proxy->login('apiUser', 'apiKey');

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

答案 2 :(得分:0)

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

  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>/dev/null | grep org
    在我的系统上,匹配./app/code/core中的12个文件和来自./app/code/local中第3方扩展名的2个匹配文件。
  5. 更改每个匹配的xml文件中的行 <import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemalocation="http://schemas.xmlsoap.org/soap/encoding/">

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

    备注:在这种情况下,encoding.xsd文件是与http://sampleshop.com/testsystem/index.php/api/v2_soap/?wsdl的api路径相对较高的4个目录。 在您的实时系统2(没有index.php)或3(使用index.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版本。

  7. Kozure