Как я могу прочитать Folloing Soap Response в php - PullRequest
1 голос
/ 23 сентября 2019
<?php
$xml ='<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://www.promostandards.org/WSDL/ProductDataService/1.0.0/SharedObjects/" xmlns:ns2="http://www.promostandards.org/WSDL/ProductDataService/1.0.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <env:Body>
        <ns2:GetProductResponse>
            <ns2:Product>
                <ns1:productId>1322059</ns1:productId>
                <ns2:productName>Smart WiFi Security Camera</ns2:productName>
                <ns2:productBrand>AAkron Line</ns2:productBrand>
                <ns2:export>false</ns2:export>
                <ns2:ProductCategoryArray>
                    <ns2:ProductCategory>
                        <ns2:category>Cameras, Safety, Health Care, Insurance, Finance, Tech Industry, NEW for 2018, New for 2019</ns2:category>
                        <ns2:subCategory>N/A</ns2:subCategory>
                    </ns2:ProductCategory>
                </ns2:ProductCategoryArray>
            </ns2:Product>
        </ns2:GetProductResponse>
    </env:Body>
</env:Envelope>';
//header("Content-type: text/xml");
//echo $xml;
$data_xml = simplexml_load_string($xml);
print_r($data_xml);
?>

Я пробовал все по другим ссылкам, но ничего не работает.выводит пустой массив.

Как прочитать XML-ответ мыла в php

Ответы [ 3 ]

0 голосов
/ 23 сентября 2019

Если вы используете DOMDocument и DOMXPath, вы можете использовать запросы XPath, чтобы найти нужные вам фрагменты информации из XML.

$xml ='<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://www.promostandards.org/WSDL/ProductDataService/1.0.0/SharedObjects/" xmlns:ns2="http://www.promostandards.org/WSDL/ProductDataService/1.0.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <env:Body>
        <ns2:GetProductResponse>
            <ns2:Product>
                <ns1:productId>1322059</ns1:productId>
                <ns2:productName>Smart WiFi Security Camera</ns2:productName>
                <ns2:productBrand>AAkron Line</ns2:productBrand>
                <ns2:export>false</ns2:export>
                <ns2:ProductCategoryArray>
                    <ns2:ProductCategory>
                        <ns2:category>Cameras, Safety, Health Care, Insurance, Finance, Tech Industry, NEW for 2018, New for 2019</ns2:category>
                        <ns2:subCategory>N/A</ns2:subCategory>
                    </ns2:ProductCategory>
                </ns2:ProductCategoryArray>
            </ns2:Product>
        </ns2:GetProductResponse>
    </env:Body>
</env:Envelope>';


$dom=new DOMDocument;
$dom->loadXML( $xml );


$xp=new DOMXPath( $dom );
$xp->registerNamespace('ns1','http://www.promostandards.org/WSDL/ProductDataService/1.0.0/SharedObjects/');
$xp->registerNamespace('ns2','http://www.promostandards.org/WSDL/ProductDataService/1.0.0/');
$xp->registerNamespace('xsi','http://www.w3.org/2001/XMLSchema-instance');
$xp->registerNamespace('env','http://www.w3.org/2003/05/soap-envelope');


$products=$xp->query('//ns2:Product');

if( $products->length > 0 ){
    foreach( $products as $product ){
        $id=$xp->query( 'ns1:productId', $product )->item(0)->nodeValue;
        $name=$xp->query( 'ns2:productName', $product )->item(0)->nodeValue;
        $brand=$xp->query( 'ns2:productBrand', $product )->item(0)->nodeValue;
        $export=$xp->query( 'ns2:export', $product )->item(0)->nodeValue;
        $category=$xp->query( 'ns2:ProductCategoryArray/ns2:ProductCategory/ns2:category', $product )->item(0)->nodeValue;
        $subcategory=$xp->query( 'ns2:ProductCategoryArray/ns2:ProductCategory/ns2:subCategory', $product )->item(0)->nodeValue;


        echo $id, $name, $brand, $category, $subcategory;
    }
}

выводит:

1322059Smart WiFi Security CameraAAkron LineCameras, Safety, Health Care, Insurance, Finance, Tech Industry, NEW for 2018, New for 2019N/A
0 голосов
/ 23 сентября 2019

Вы также можете использовать SimpleXML и Xpath .

function getNsValue($xml, $path, $index = 0){
  return (string)$xml->xpath($path)[$index];
}

xml тестовые данные:

$xml ='<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://www.promostandards.org/WSDL/ProductDataService/1.0.0/SharedObjects/" xmlns:ns2="http://www.promostandards.org/WSDL/ProductDataService/1.0.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <env:Body>
        <ns2:GetProductResponse>
            <ns2:Product>
                <ns1:productId>1322059</ns1:productId>
                <ns2:productName>Smart WiFi Security Camera</ns2:productName>
                <ns2:productBrand>AAkron Line</ns2:productBrand>
                <ns2:export>false</ns2:export>
                <ns2:ProductCategoryArray>
                    <ns2:ProductCategory>
                        <ns2:category>Cameras, Safety, Health Care, Insurance, Finance, Tech Industry, NEW for 2018, New for 2019</ns2:category>
                        <ns2:subCategory>N/A</ns2:subCategory>
                    </ns2:ProductCategory>
                </ns2:ProductCategoryArray>
            </ns2:Product>
        </ns2:GetProductResponse>
    </env:Body>
</env:Envelope>';

$data_xml = simplexml_load_string($xml);

Примеры:

$category = getNsValue($data_xml,'//ns2:category');

$productId = getNsValue($data_xml,'//ns1:productId');

var_dump($category, $productId);
/*
string(91) "Cameras, Safety, Health Care, Insurance, Finance, Tech Industry, NEW for 2018, New for 2019"
string(7) "1322059"
*/    
0 голосов
/ 23 сентября 2019

Я решил мою проблему, используя следующий код:

$ response = file_get_contents ($ xml);

$ res = simplexml_load_string ($ response);

print_r($ Рез);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...