【问题标题】:PHP - converting XML to array in PHP - parsing a soap xml in php and storing it in databasePHP - 在 PHP 中将 XML 转换为数组 - 在 php 中解析一个肥皂 xml 并将其存储在数据库中
【发布时间】:2011-09-22 11:52:44
【问题描述】:

我想转换一个soap xml 响应并将其存储在数据库中。这是我拥有的 XML。

<ENV:Envelope xmlns:ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://example.com/soap/example">
   <ENV:Body>
      <ns1:GetCentresResponse>
         <ExampleCentre>
            <ns1:Cent>
               <ID>200</ID>
               <Name>example2</Name>
               <Code>ex2</Code>
               <Email>example2@example2.com</Email>
               <Address1>example2, example2 </Address1>
               <Address2>example2, example2 </Address2>
               <City>example2</City>
               <PostCode>111111</PostCode>
               <Telephone>1111111111</Telephone>
               <Location>11.11,-11.11</Location>
               <URL>/example2/exam2/ex2</URL>
            </ns1:Cent>
         </ExampleCentre>
      </ns1:GetCentresResponse>
   </ENV:Body>
</ENV:Envelope>

我从服务器得到这个肥皂响应。我想将其转换为数组并将其存储在数据库中。我应该怎么办?我知道答案可能很简单,但是嘿,我是新手 :D

非常感谢我得到的任何帮助。

谢谢你的期待。

问候

【问题讨论】:

    标签: php xml arrays parsing soap


    【解决方案1】:

    最好的解决方案是使用 PHP 的 SoapClient 类进行调用,该调用将返回一个对象,然后将该对象转换为数组,如下所示:

    <?php
    $client = new SoapClient("http://localhost/code/soap.wsdl");
    
    // Soap call with HelloWorld() method
    $something =  $client->HelloWorld(array('option1' => 'attribute1'));
    
    // Convert object to array
    $array = (array)$something;
    
    ?>
    

    然后您可以将其存储在数据库中。

    【讨论】:

    • 您可能想提一下,SOAP 调用的返回值将包含一个对象,该对象的成员与该 XML 文件匹配。
    • 谢谢你,不知道这门课:)
    【解决方案2】:

    如果您不能使用SoapClient 来检索 PHP 对象中的 SOAP 响应,则使用 SimpleXML 来解析 soap 响应。

    例如($xmlstr 包含 SOAP 响应):

    $element = new SimpleXMLElement( $xmlstr );
    $centerElement = $element->Body->GetCentresResponse->ExampleCentre->Cent;
    
    $center = array(
        $centerElement->ID,
        $centerElement->Name,
        $centerElement->Code,
        $centerElement->Email,
        $centerElement->Address1,
        $centerElement->Address2,
        $centerElement->City,
        $centerElement->PostCode,
        $centerElement->Telephone,
        $centerElement->Location,
        $centerElement->URL,
    );
    

    现在您可以将$center 存储在数据库中。

    【讨论】:

    • 嗨,谢谢乔恩的回复。它确实奏效了。连同给出的其他答案。非常感谢。
    【解决方案3】:

    使用以下代码将 SOAP 响应解析为数组:

    您只需要使用 SOAP-XML 调用函数。之后它将返回一个纯 XML,然后您必须使用 JSON 编码解码将其转换为数组。

    $plainXML = mungXML($soapXML);
    $arrayResult = json_decode(json_encode(SimpleXML_Load_String($plainXML, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
    
    
    // FUNCTION TO MUNG THE XML SO WE DO NOT HAVE TO DEAL WITH NAMESPACE
    function mungXML($xml)
    {
        $obj = SimpleXML_Load_String($xml);
        if ($obj === FALSE) return $xml;
    
        // GET NAMESPACES, IF ANY
        $nss = $obj->getNamespaces(TRUE);
        if (empty($nss)) return $xml;
    
        // CHANGE ns: INTO ns_
        $nsm = array_keys($nss);
        foreach ($nsm as $key)
        {
            // A REGULAR EXPRESSION TO MUNG THE XML
            $rgx
            = '#'               // REGEX DELIMITER
            . '('               // GROUP PATTERN 1
            . '\<'              // LOCATE A LEFT WICKET
            . '/?'              // MAYBE FOLLOWED BY A SLASH
            . preg_quote($key)  // THE NAMESPACE
            . ')'               // END GROUP PATTERN
            . '('               // GROUP PATTERN 2
            . ':{1}'            // A COLON (EXACTLY ONE)
            . ')'               // END GROUP PATTERN
            . '#'               // REGEX DELIMITER
            ;
            // INSERT THE UNDERSCORE INTO THE TAG NAME
            $rep
            = '$1'          // BACKREFERENCE TO GROUP 1
            . '_'           // LITERAL UNDERSCORE IN PLACE OF GROUP 2
            ;
            // PERFORM THE REPLACEMENT
            $xml =  preg_replace($rgx, $rep, $xml);
        }
        return $xml;
    }
    
    print_r($arrayResult);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      相关资源
      最近更新 更多