Неустранимая ошибка: необработанное исключение SoapFault: [WSDL] SOAP-ERROR: схема синтаксического анализа: невозможно импортировать схему из 'http://schemas.xmlsoap.org/soap/encoding/' - PullRequest
2 голосов
/ 11 августа 2011
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing Schema: can't import schema from 'http://schemas.xmlsoap.org/soap/encoding/'

Во-первых, мне жаль говорить, что я поставил эти вопросы здесь, потому что столько же вопросов возникает в stackoverflow.Но, похоже, мне это не подходит.

Иногда я использую API-интерфейс Magento SOAP2, эта ошибка встречается не часто.Но он продолжает приводить к фатальной ошибке, когда я запускаю свой скрипт сегодня.

Я искал какой-то метод для решения этой проблемы, например, в некоторых статьях мне предлагалось изменить этот код в / 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 ]

2 голосов
/ 11 августа 2011

Прежде всего, пожалуйста, никогда не вмешивайтесь в элементы по умолчанию любого файла конфигурации WSDL Magento API V2. Это основное правило.

Не забывайте записывать следующие элементы в начале каждого пользовательского файла WSDL или убедитесь, что в начале файла WSDL целевого существующего модуля присутствуют следующие элементы: -

  1. "definition" элемент (<definitions> - начальный тег)
  2. Элемент * types (<types> - начальный тег)
  3. Элемент "schema" (<schema> - начальный тег)
  4. Элемент * import (<import /> - одиночный тег, без конечного тега)

Затем вы можете продолжить определение сложных типов данных Magento API V2 для этого пользовательского модуля.

Вы можете очень хорошо понять все это, взглянув на некоторые из существующих WSDL-файлов Magento API V2.


Теперь вернемся к вашим вопросам ...

1. Любой способ решить это? Как я уже говорил, пожалуйста, сохраняйте вышеупомянутые определения элементов в начале вашего WSDL-файла.

Оператор "import" должен был выглядеть так: -
<import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="http://schemas.xmlsoap.org/soap/encoding/" />
без конечного тега. Также имя атрибута "schemaLocation", а не "schemalocation". Пожалуйста, следуйте за верблюжьим кожухом.


2. Могу ли я создать этот xmlsoap.org xml-файл для localhost или моего собственного сервера, чтобы мой сценарий не зависел от файла на моем сервере?

Да, вы можете, но вам нужно знать и поддерживать два важных момента: -

  1. Оба атрибута "namespace" & "schemaLocation" должны иметь тип URI в соответствии со спецификациями W3C. Поэтому ваши локальные файлы для обоих этих атрибутов также должны быть доступны в локальном браузере по протоколу HTTP.
  2. Если вы поддерживаете его на локальном жестком диске, то вы забываете об одном золотом правиле обновления, для Схемы файла кодировки SOAP / 1.1. Это связано с тем, что если (только если) W3C обновит этот файл в том же URI, то ваш Magento сможет его автоматически принять, если будет предоставлен общий URI; в противном случае вам потребуется снова загрузить этот обновленный файл на ваш сервер.

Кроме этих двух основных моментов, все в порядке, и вы готовы идти.


Тем не менее, я надеюсь, что я ответил на все ваши вопросы. Надеюсь, это поможет.

0 голосов
/ 16 сентября 2015

Только некоторые детали для принятого решения.

  1. Введите адрес расположения схемы в вашем браузере:

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

  2. Сохранить результат XML в браузере в файле с именем encoding.xsd (сохранить файл как).

  3. Скопируйте этот файл в корневой каталог вашего magento web, например, /var/www/magento/
  4. Поиск всех записей schemaLocation в файлах wsd * .xml из корневой папки magento, например, с помощью.
    find . -name "wsdl*.xml" | xargs grep schemaLocation 2>/dev/null | grep org
    В моей системе 12 соответствующих файлов в ./app/code/core и 2 соответствующих файла из сторонних расширений в ./app/code/local.
  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 имеет 4 каталога выше по отношению к пути API http://sampleshop.com/testsystem/index.php/api/v2_soap/?wsdl
    В вашей действующей системе 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 с версией php 5.3 на сервере magento и 5.6 на удаленном сервере.

Kozure

0 голосов
/ 15 апреля 2013

Использовать такой код, как

// создать мыльный объект

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

// создать авторизованный идентификатор сеанса, используя имя пользователя API и ключ API

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

$productinfo = $proxy->call($sessionId, 'product.info',16);
echo "<pre>";print_r($productinfo);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...