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或我自己的服务器,以便我的脚本不依赖于我的服务器上的文件。
提前谢谢!
答案 0 :(得分:2)
首先,请不要篡改任何Magento API V2 WSDL配置文件的默认元素。这是一个基本规则。
请记住在每个自定义WSDL文件的开头写下以下这些元素,或者确保在目标现有模块的WSDL文件的开头出现以下这些元素: -
definition
”元素(<definitions>
- 开始标记)types
”元素(<types>
- 开始标记)schema
”元素(<schema>
- 开始标记)import
”元素(<import />
- 单例标记,没有结束标记)然后,您可以继续为该自定义模块定义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;保持两个关键点: -
namespace
”&amp;根据W3C规范,“schemaLocation
”必须是URI类型。因此,必须使用HTTP协议在本地浏览器中访问这两个属性的本地文件。除了这两个要点外,一切都还可以。你很高兴。
尽管如此,我希望我已经回答了你的所有疑问。希望它有所帮助。
答案 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)
接受解决方案的一些细节。
在浏览器中输入架构位置的地址:
将XML结果保存在名为encoding.xsd
的文件中(将文件另存为)。
/var/www/magento/
find . -name "wsdl*.xml" | xargs grep schemaLocation 2>/dev/null | grep org
更改每个匹配的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)时,"../"
次可能是正确的。
尝试从本地和远程服务器进行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版本。
Kozure