Как разобрать ответ мыла XML, для которого определены несколько пространств имен.Мне нужно разобрать возвращенный массив Articles - PullRequest
0 голосов
/ 01 мая 2019

Мыльный XML-ответ выглядит так:

 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
       <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:NS1="urn:TPAPIPosIntfU-ITPAPIPOS">
          <NS1:GetArticlesInfoResponse xmlns:NS2="urn:TPAPIPosIntfU" xmlns:NS3="urn:TPAPIPosTypesU">
             <return xsi:type="NS2:TGetArticlesInfoResponse">
                <ReturnCode xsi:type="xsd:int">0</ReturnCode>
                <ReturnMessage xsi:type="xsd:string">ok</ReturnMessage>
                <Articles xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TArticleInfo[x]">...</Articles>
                <Extra xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TExtraInfo[0]"/>
             </return>
          </NS1:GetArticlesInfoResponse>
       </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

И это массив статей, который мне нужно проанализировать:

<item xsi:type="NS3:TArticleInfo">
    <ArticleId xsi:type="xsd:long">5000001716</ArticleId>
    <ArticleName xsi:type="xsd:string">Coca Cola</ArticleName>
    <ArticleNumber xsi:type="xsd:int">1</ArticleNumber>
    <Available xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:long[3]">
        <item>5000000210</item>
        <item>5000000208</item>
        <item>5000000209</item>
    </Available>
    <DepartmentId xsi:type="xsd:long">5000000170</DepartmentId>
    <Prices xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TItemPrice[2]">
        <item xsi:type="NS3:TItemPrice">
        <ArticleId xsi:type="xsd:long">5000001716</ArticleId>
        <PriceId xsi:type="xsd:long">5000000206</PriceId>
        <Amount xsi:type="xsd:double">2</Amount>
        <Vat xsi:type="xsd:double">21</Vat>
        <Extra xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TExtraInfo[0]"/>
    </item>
    <item xsi:type="NS3:TItemPrice">
        <ArticleId xsi:type="xsd:long">5000001716</ArticleId>
        <PriceId xsi:type="xsd:long">5000000207</PriceId>
        <Amount xsi:type="xsd:double">1.7</Amount>
        <Vat xsi:type="xsd:double">12</Vat>
        <Extra xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TExtraInfo[0]"/>
    </item>
    </Prices>
    <FreeOption xsi:type="xsd:long">5000000145</FreeOption>
    <Options xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:long[1]">
        <item>5000000143</item>
    </Options>
    <IsMenu xsi:type="xsd:boolean">false</IsMenu>
    <IsManualPrice xsi:type="xsd:boolean">false</IsManualPrice>
    <IsActive xsi:type="xsd:boolean">true</IsActive>
    <Promo xsi:type="xsd:boolean">false</Promo>
    <HqId xsi:type="xsd:string">Coca Cola</HqId>
    <Extra xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TExtraInfo[5]">
        <item xsi:type="NS3:TExtraInfo">
            <Key xsi:type="xsd:string">daily_stock_active</Key>
            <Value xsi:type="xsd:string">0</Value>
            <Extra xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TExtraInfo[0]"/>
        </item>
        <item xsi:type="NS3:TExtraInfo">
            <Key xsi:type="xsd:string">daily_stock_qty</Key>
            <Value xsi:type="xsd:string">0</Value>
            <Extra xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TExtraInfo[0]"/>
        </item>
        <item xsi:type="NS3:TExtraInfo">
            <Key xsi:type="xsd:string">purchase_price</Key>
            <Value xsi:type="xsd:string">0.0000</Value>
            <Extra xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TExtraInfo[0]"/>
            </item>
        <item xsi:type="NS3:TExtraInfo">
            <Key xsi:type="xsd:string">course_id</Key>
            <Value xsi:type="xsd:string">5000001331</Value>
            <Extra xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TExtraInfo[0]"/>
        </item>
        <item xsi:type="NS3:TExtraInfo">
            <Key xsi:type="xsd:string">info</Key>
            <Value xsi:type="xsd:string"/>
            <Extra xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TExtraInfo[0]"/>
        </item>
    </Extra>
</item>
Parameter   Type    Description
ArticleId   Long    Internal Id of this Article
ArticleName String  Name of this Article
ArticleNumber   Integer Number of this Article
Available   [Long]  List of Sales Area Id's where this Article is available
Prices  [ItemPrice] List of Prices for this Article
DepartmentId    Long    Id of the Department where this Article belongs to
FreeOption  Long    Free Option ID
Options [Long]  List of must-have options
IsMenu  Boolean Returns true if this Article is a menu
IsManualPrice   Boolean Returns true if this Article requires a manual price input when ordered
IsActive    Boolean Returns if true is this Article is active
Promo   Boolean Return true if this Article is a Cobmo/Promo article
HqId    String  HQ Id
Extra   [ExtraInfo] List of extra fields
List of available extra fields:

Key Description
course_id   Only return articles of a specific course
daily_stock_active  1/0 (if DailyStock=1 was specified in request’s Extra fields)
daily_stock_qty Daily stock quantity (if DailyStock=1 was specified in request’s Extra fields)
info    Article info (tab 9 of the article settings in back-office)
plu When PLU is not zero
purchase_price  Purchase price
ArticleShort
ArticleShort Object

<item xsi:type="NS3:TArticleShort">
    <ArticleId xsi:type="xsd:long">5000001716</ArticleId>
    <ArticleName xsi:type="xsd:string">Coca Cola</ArticleName>
    <ArticleNumber xsi:type="xsd:int">1</ArticleNumber>
    <SalesAreaId xsi:type="xsd:long">5000000210</SalesAreaId>
    <DepartmentId xsi:type="xsd:long">5000000170</DepartmentId>
    <HqId xsi:type="xsd:string">Coca Cola</HqId>
    <Extra xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="NS3:TExtraInfo[0]"/>
</item>

Как я могу проанализировать этот XML-ответ мыла вphp curl, чтобы получить данные массива Articles?Я пробовал SimpleXMLElement, но я не могу разобрать это.

Я много перебирал ответы, но не смог найти правильную технику разбора.Должен ли я использовать Xpath, если да, то как создать XPath для разбора массива статей?

1 Ответ

1 голос
/ 01 мая 2019

Простое решение с использованием XPath и SimpleXML, которое, с точки зрения XML, не включает пространства имен для самого XPath. Это загружает XML и затем ищет элемент с именем <return> с прямым потомком с именем <Articles>. Поскольку xpath() возвращает список узлов, он просто выбирает первый (используя [0]) и выполняет итерацию вложенных элементов <item> и выводит значение <ArticleId> элементов ....

$xml = simplexml_load_string($data);
$articles = $xml->xpath("//return/Articles");

foreach ( $articles[0]->item as $item )    {
    echo (string)$item->ArticleId.PHP_EOL;
}

С данными испытаний это дает ...

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