【问题标题】:PHP How to access SimpleXMLElement object variable outside foreachPHP如何访问foreach之外的SimpleXMLElement对象变量
【发布时间】:2018-10-25 23:03:03
【问题描述】:

如果我有一个在 foreach 循环内的 SimpleXMLElement 对象,我如何在循环外访问它?

$auth_tokens = array('tok1', 'tok2', 'tok3', 'tok4');

foreach($auth_tokens as $auth_token) { // 4 iterations in loop
    $response = curl_exec($connection); // API xml response
    $xml = simplexml_load_string($response); // loaded xml into object
}

echo header('content-type: text/xml');
echo $xml->asXML();

.= 不起作用

[] 不起作用

更新:

下面是从 api xml $response 实际输出的内容。如您所见,因为我要查询 4 ​​个身份验证令牌,所以每次迭代都是一个新的 xml 响应。当我尝试在循环之外访问它时,由于多个 <?xml version="1.0" encoding="UTF-8"?> xml 标头,它无法正常工作。

我被困住了。不知道如何将所有 4 个响应合二为一。

更新 2:

Nick 帮助我弄清楚如何将所有 4 个响应放入一个 xml 文档中,但我需要编辑节点名称和值,当 xml 位于 SimpleXMLElement 对象中时,这很容易做到。所以我想我可以先在对象中处理数据,然后当我完成后,将对象转换回 xml 并保存。但是我在访问循环外的对象时遇到了问题。这是因为有 4 个对象而不仅仅是 1 个,所以.= 没有保存数据。

这是我echo $response; 并查看源代码时 API 输出的内容。它只是纯 xml。

<?xml version="1.0" encoding="UTF-8"?>
<GetOrdersResponse xmlns="urn:ebay:apis:eBLBaseComponents">
  <Timestamp>2018-10-26T16:04:38.375Z</Timestamp>
  <Ack>Success</Ack>
  <Version>1083</Version>
  <Build>E1083_CORE_APIXO_18856776_R1</Build>
  <PaginationResult>
    <TotalNumberOfEntries>1</TotalNumberOfEntries>
  </PaginationResult>
  <OrderArray>
    <Order>
      <OrderID>11306025</OrderID>
      <OrderStatus>Completed</OrderStatus>
      <CreatedTime>2018-10-26T14:38:44.000Z</CreatedTime>
    </Order>
  </OrderArray>
</GetOrdersResponse>
<?xml version="1.0" encoding="UTF-8"?>
<GetOrdersResponse xmlns="urn:ebay:apis:eBLBaseComponents">
  <Timestamp>2018-10-26T16:04:39.049Z</Timestamp>
  <Ack>Success</Ack>
  <Version>1083</Version>
  <Build>E1083_CORE_APIXO_18856776_R1</Build>
  <PaginationResult>
    <TotalNumberOfEntries>3</TotalNumberOfEntries>
  </PaginationResult>
  <OrderArray>
    <Order>
      <OrderID>39168452</OrderID>
      <OrderStatus>Completed</OrderStatus>
      <CreatedTime>2018-10-26T14:38:53.000Z</CreatedTime>
    </Order>
    <Order>
      <OrderID>37219192</OrderID>
      <OrderStatus>Completed</OrderStatus>
      <CreatedTime>2018-10-26T15:36:41.000Z</CreatedTime>
    </Order>
    <Order>
      <OrderID>37198277</OrderID>
      <OrderStatus>Completed</OrderStatus>
      <CreatedTime>2018-10-26T15:35:01.000Z</CreatedTime>
    </Order>
  </OrderArray>
</GetOrdersResponse>
<?xml version="1.0" encoding="UTF-8"?>
<GetOrdersResponse xmlns="urn:ebay:apis:eBLBaseComponents">
  <Timestamp>2018-10-26T16:04:39.454Z</Timestamp>
  <Ack>Success</Ack>
  <Version>1083</Version>
  <Build>E1083_CORE_APIXO_18856776_R1</Build>
  <PaginationResult>
    <TotalNumberOfEntries>2</TotalNumberOfEntries>
  </PaginationResult>
  <OrderArray>
    <Order>
      <OrderID>16283499</OrderID>
      <OrderStatus>Completed</OrderStatus>
      <CreatedTime>2018-10-26T15:13:21.000Z</CreatedTime>
    </Order>
    <Order>
      <OrderID>16283499</OrderID>
      <OrderStatus>Completed</OrderStatus>
      <CreatedTime>2018-10-26T15:36:40.000Z</CreatedTime>
    </Order>
  </OrderArray>
</GetOrdersResponse>
<?xml version="1.0" encoding="UTF-8"?>
<GetOrdersResponse xmlns="urn:ebay:apis:eBLBaseComponents">
  <Timestamp>2018-10-26T16:04:39.782Z</Timestamp>
  <Ack>Success</Ack>
  <Version>1083</Version>
  <Build>E1083_CORE_APIXO_18856776_R1</Build>
  <PaginationResult>
    <TotalNumberOfEntries>1</TotalNumberOfEntries>
  </PaginationResult>
  <OrderArray>
    <Order>
      <OrderID>26348797</OrderID>
      <OrderStatus>Completed</OrderStatus>
      <CreatedTime>2018-10-26T15:40:25.000Z</CreatedTime>
    </Order>
  </OrderArray>
</GetOrdersResponse>

这是我执行var_dump ($response); 并查看源代码时得到的结果。

string(504) "
<?xml version="1.0" encoding="UTF-8"?>
<GetOrdersResponse xmlns="urn:ebay:apis:eBLBaseComponents">
  <Timestamp>2018-10-26T16:10:49.358Z</Timestamp>
  <Ack>Success</Ack>
  <Version>1083</Version>
  <Build>E1083_CORE_APIXO_18856776_R1</Build>
  <PaginationResult>
    <TotalNumberOfEntries>1</TotalNumberOfEntries>
  </PaginationResult>
  <OrderArray>
    <Order>
      <OrderID>11306025</OrderID>
      <OrderStatus>Completed</OrderStatus>
      <CreatedTime>2018-10-26T14:38:44.000Z</CreatedTime>
    </Order>
  </OrderArray>
</GetOrdersResponse>
"
string(797) "
<?xml version="1.0" encoding="UTF-8"?>
<GetOrdersResponse xmlns="urn:ebay:apis:eBLBaseComponents">
  <Timestamp>2018-10-26T16:10:49.439Z</Timestamp>
  <Ack>Success</Ack>
  <Version>1083</Version>
  <Build>E1083_CORE_APIXO_18856776_R1</Build>
  <PaginationResult>
    <TotalNumberOfEntries>3</TotalNumberOfEntries>
  </PaginationResult>
  <OrderArray>
    <Order>
      <OrderID>39168452</OrderID>
      <OrderStatus>Completed</OrderStatus>
      <CreatedTime>2018-10-26T14:38:53.000Z</CreatedTime>
    </Order>
    <Order>
      <OrderID>37219192</OrderID>
      <OrderStatus>Completed</OrderStatus>
      <CreatedTime>2018-10-26T15:36:41.000Z</CreatedTime>
    </Order>
    <Order>
      <OrderID>37198277</OrderID>
      <OrderStatus>Completed</OrderStatus>
      <CreatedTime>2018-10-26T15:35:01.000Z</CreatedTime>
    </Order>
  </OrderArray>
</GetOrdersResponse>
"
string(798) "
<?xml version="1.0" encoding="UTF-8"?>
<GetOrdersResponse xmlns="urn:ebay:apis:eBLBaseComponents">
  <Timestamp>2018-10-26T16:10:50.001Z</Timestamp>
  <Ack>Success</Ack>
  <Version>1083</Version>
  <Build>E1083_CORE_APIXO_18856776_R1</Build>
  <PaginationResult>
    <TotalNumberOfEntries>3</TotalNumberOfEntries>
  </PaginationResult>
  <OrderArray>
    <Order>
      <OrderID>16283499</OrderID>
      <OrderStatus>Completed</OrderStatus>
      <CreatedTime>2018-10-26T15:13:21.000Z</CreatedTime>
    </Order>
    <Order>
      <OrderID>16283499</OrderID>
      <OrderStatus>Completed</OrderStatus>
      <CreatedTime>2018-10-26T15:36:40.000Z</CreatedTime>
    </Order>
    <Order>
      <OrderID>16275107</OrderID>
      <OrderStatus>Completed</OrderStatus>
      <CreatedTime>2018-10-26T16:09:40.000Z</CreatedTime>
    </Order>
  </OrderArray>
</GetOrdersResponse>
"
string(504) "
<?xml version="1.0" encoding="UTF-8"?>
<GetOrdersResponse xmlns="urn:ebay:apis:eBLBaseComponents">
  <Timestamp>2018-10-26T16:10:50.329Z</Timestamp>
  <Ack>Success</Ack>
  <Version>1083</Version>
  <Build>E1083_CORE_APIXO_18856776_R1</Build>
  <PaginationResult>
    <TotalNumberOfEntries>1</TotalNumberOfEntries>
  </PaginationResult>
  <OrderArray>
    <Order>
      <OrderID>26348797</OrderID>
      <OrderStatus>Completed</OrderStatus>
      <CreatedTime>2018-10-26T15:40:25.000Z</CreatedTime>
    </Order>
  </OrderArray>
</GetOrdersResponse>
"

如果我在 foreach 中使用 $xml = simplexml_load_string($response);var_dump ($xml);,则输出 4 个对象。

object(SimpleXMLElement)#1 (6) {
  ["Timestamp"]=>
  string(24) "2018-10-26T16:32:21.048Z"
  ["Ack"]=>
  string(7) "Success"
  ["Version"]=>
  string(4) "1083"
  ["Build"]=>
  string(28) "E1083_CORE_APIXO_18856776_R1"
  ["PaginationResult"]=>
  object(SimpleXMLElement)#2 (1) {
    ["TotalNumberOfEntries"]=>
    string(1) "1"
  }
  ["OrderArray"]=>
  object(SimpleXMLElement)#3 (1) {
    ["Order"]=>
    object(SimpleXMLElement)#4 (3) {
      ["OrderID"]=>
      string(26) "11306025"
      ["OrderStatus"]=>
      string(9) "Completed"
      ["CreatedTime"]=>
      string(24) "2018-10-26T14:38:44.000Z"
    }
  }
}
object(SimpleXMLElement)#3 (6) {
  ["Timestamp"]=>
  string(24) "2018-10-26T16:32:21.736Z"
  ["Ack"]=>
  string(7) "Success"
  ["Version"]=>
  string(4) "1083"
  ["Build"]=>
  string(28) "E1083_CORE_APIXO_18856776_R1"
  ["PaginationResult"]=>
  object(SimpleXMLElement)#1 (1) {
    ["TotalNumberOfEntries"]=>
    string(1) "4"
  }
  ["OrderArray"]=>
  object(SimpleXMLElement)#2 (1) {
    ["Order"]=>
    array(4) {
      [0]=>
      object(SimpleXMLElement)#4 (3) {
        ["OrderID"]=>
        string(25) "39168452"
        ["OrderStatus"]=>
        string(9) "Completed"
        ["CreatedTime"]=>
        string(24) "2018-10-26T14:38:53.000Z"
      }
      [1]=>
      object(SimpleXMLElement)#5 (3) {
        ["OrderID"]=>
        string(26) "37219192"
        ["OrderStatus"]=>
        string(9) "Completed"
        ["CreatedTime"]=>
        string(24) "2018-10-26T15:36:41.000Z"
      }
      [2]=>
      object(SimpleXMLElement)#6 (3) {
        ["OrderID"]=>
        string(26) "37198277"
        ["OrderStatus"]=>
        string(9) "Completed"
        ["CreatedTime"]=>
        string(24) "2018-10-26T15:35:01.000Z"
      }
      [3]=>
      object(SimpleXMLElement)#7 (3) {
        ["OrderID"]=>
        string(26) "37185515"
        ["OrderStatus"]=>
        string(9) "Completed"
        ["CreatedTime"]=>
        string(24) "2018-10-26T16:24:19.000Z"
      }
    }
  }
}
object(SimpleXMLElement)#2 (6) {
  ["Timestamp"]=>
  string(24) "2018-10-26T16:32:22.529Z"
  ["Ack"]=>
  string(7) "Success"
  ["Version"]=>
  string(4) "1083"
  ["Build"]=>
  string(28) "E1083_CORE_APIXO_18856776_R1"
  ["PaginationResult"]=>
  object(SimpleXMLElement)#3 (1) {
    ["TotalNumberOfEntries"]=>
    string(1) "3"
  }
  ["OrderArray"]=>
  object(SimpleXMLElement)#1 (1) {
    ["Order"]=>
    array(3) {
      [0]=>
      object(SimpleXMLElement)#7 (3) {
        ["OrderID"]=>
        string(26) "16283499"
        ["OrderStatus"]=>
        string(9) "Completed"
        ["CreatedTime"]=>
        string(24) "2018-10-26T15:13:21.000Z"
      }
      [1]=>
      object(SimpleXMLElement)#6 (3) {
        ["OrderID"]=>
        string(26) "16283499"
        ["OrderStatus"]=>
        string(9) "Completed"
        ["CreatedTime"]=>
        string(24) "2018-10-26T15:36:40.000Z"
      }
      [2]=>
      object(SimpleXMLElement)#5 (3) {
        ["OrderID"]=>
        string(26) "16275107"
        ["OrderStatus"]=>
        string(9) "Completed"
        ["CreatedTime"]=>
        string(24) "2018-10-26T16:09:40.000Z"
      }
    }
  }
}
object(SimpleXMLElement)#1 (6) {
  ["Timestamp"]=>
  string(24) "2018-10-26T16:32:22.751Z"
  ["Ack"]=>
  string(7) "Success"
  ["Version"]=>
  string(4) "1083"
  ["Build"]=>
  string(28) "E1083_CORE_APIXO_18856776_R1"
  ["PaginationResult"]=>
  object(SimpleXMLElement)#2 (1) {
    ["TotalNumberOfEntries"]=>
    string(1) "1"
  }
  ["OrderArray"]=>
  object(SimpleXMLElement)#3 (1) {
    ["Order"]=>
    object(SimpleXMLElement)#5 (3) {
      ["OrderID"]=>
      string(26) "26348797"
      ["OrderStatus"]=>
      string(9) "Completed"
      ["CreatedTime"]=>
      string(24) "2018-10-26T15:40:25.000Z"
    }
  }
}

这就是我echo '&lt;pre&gt;' . var_export($xml, true) . '&lt;/pre&gt;&lt;br&gt;'; 时得到的输出。我发现这个更容易阅读,并且可以清楚地看到它是 4 个对象。

SimpleXMLElement::__set_state(array(
   'Timestamp' => '2018-10-26T16:36:41.377Z',
   'Ack' => 'Success',
   'Version' => '1083',
   'Build' => 'E1083_CORE_APIXO_18856776_R1',
   'PaginationResult' => 
  SimpleXMLElement::__set_state(array(
     'TotalNumberOfEntries' => '1',
  )),
   'OrderArray' => 
  SimpleXMLElement::__set_state(array(
     'Order' => 
    SimpleXMLElement::__set_state(array(
       'OrderID' => '11306025',
       'OrderStatus' => 'Completed',
       'CreatedTime' => '2018-10-26T14:38:44.000Z',
    )),
  )),
))


SimpleXMLElement::__set_state(array(
   'Timestamp' => '2018-10-26T16:36:43.083Z',
   'Ack' => 'Success',
   'Version' => '1083',
   'Build' => 'E1083_CORE_APIXO_18856776_R1',
   'PaginationResult' => 
  SimpleXMLElement::__set_state(array(
     'TotalNumberOfEntries' => '4',
  )),
   'OrderArray' => 
  SimpleXMLElement::__set_state(array(
     'Order' => 
    array (
      0 => 
      SimpleXMLElement::__set_state(array(
         'OrderID' => '39168452',
         'OrderStatus' => 'Completed',
         'CreatedTime' => '2018-10-26T14:38:53.000Z',
      )),
      1 => 
      SimpleXMLElement::__set_state(array(
         'OrderID' => '37219192',
         'OrderStatus' => 'Completed',
         'CreatedTime' => '2018-10-26T15:36:41.000Z',
      )),
      2 => 
      SimpleXMLElement::__set_state(array(
         'OrderID' => '37198277',
         'OrderStatus' => 'Completed',
         'CreatedTime' => '2018-10-26T15:35:01.000Z',
      )),
      3 => 
      SimpleXMLElement::__set_state(array(
         'OrderID' => '37185515',
         'OrderStatus' => 'Completed',
         'CreatedTime' => '2018-10-26T16:24:19.000Z',
      )),
    ),
  )),
))


SimpleXMLElement::__set_state(array(
   'Timestamp' => '2018-10-26T16:36:43.783Z',
   'Ack' => 'Success',
   'Version' => '1083',
   'Build' => 'E1083_CORE_APIXO_18856776_R1',
   'PaginationResult' => 
  SimpleXMLElement::__set_state(array(
     'TotalNumberOfEntries' => '4',
  )),
   'OrderArray' => 
  SimpleXMLElement::__set_state(array(
     'Order' => 
    array (
      0 => 
      SimpleXMLElement::__set_state(array(
         'OrderID' => '16283499',
         'OrderStatus' => 'Completed',
         'CreatedTime' => '2018-10-26T15:13:21.000Z',
      )),
      1 => 
      SimpleXMLElement::__set_state(array(
         'OrderID' => '16283499',
         'OrderStatus' => 'Completed',
         'CreatedTime' => '2018-10-26T15:36:40.000Z',
      )),
      2 => 
      SimpleXMLElement::__set_state(array(
         'OrderID' => '16275107',
         'OrderStatus' => 'Completed',
         'CreatedTime' => '2018-10-26T16:09:40.000Z',
      )),
      3 => 
      SimpleXMLElement::__set_state(array(
         'OrderID' => '16258277',
         'OrderStatus' => 'Completed',
         'CreatedTime' => '2018-10-26T16:36:19.000Z',
      )),
    ),
  )),
))


SimpleXMLElement::__set_state(array(
   'Timestamp' => '2018-10-26T16:36:44.157Z',
   'Ack' => 'Success',
   'Version' => '1083',
   'Build' => 'E1083_CORE_APIXO_18856776_R1',
   'PaginationResult' => 
  SimpleXMLElement::__set_state(array(
     'TotalNumberOfEntries' => '1',
  )),
   'OrderArray' => 
  SimpleXMLElement::__set_state(array(
     'Order' => 
    SimpleXMLElement::__set_state(array(
       'OrderID' => '26348797',
       'OrderStatus' => 'Completed',
       'CreatedTime' => '2018-10-26T15:40:25.000Z',
    )),
  )),
))

这就是我在循环中使用 echo header('content-type: text/xml'); echo $xml-&gt;asXML(); 时得到的输出。

  <?xml version="1.0" encoding="UTF-8"?>
  <GetOrdersResponse xmlns="urn:ebay:apis:eBLBaseComponents">
    <Timestamp>2018-10-26T16:42:57.532Z</Timestamp>
    <Ack>Success</Ack>
    <Version>1083</Version>
    <Build>E1083_CORE_APIXO_18856776_R1</Build>
    <PaginationResult>
      <TotalNumberOfEntries>1</TotalNumberOfEntries>
    </PaginationResult>
    <OrderArray>
      <Order>
        <OrderID>11306025</OrderID>
        <OrderStatus>Completed</OrderStatus>
        <CreatedTime>2018-10-26T14:38:44.000Z</CreatedTime>
      </Order>
    </OrderArray>
  </GetOrdersResponse>
  <?xml version="1.0" encoding="UTF-8"?>
  <GetOrdersResponse xmlns="urn:ebay:apis:eBLBaseComponents">
    <Timestamp>2018-10-26T16:42:58.218Z</Timestamp>
    <Ack>Success</Ack>
    <Version>1083</Version>
    <Build>E1083_CORE_APIXO_18856776_R1</Build>
    <PaginationResult>
      <TotalNumberOfEntries>4</TotalNumberOfEntries>
    </PaginationResult>
    <OrderArray>
      <Order>
        <OrderID>39168452</OrderID>
        <OrderStatus>Completed</OrderStatus>
        <CreatedTime>2018-10-26T14:38:53.000Z</CreatedTime>
      </Order>
      <Order>
        <OrderID>37219192</OrderID>
        <OrderStatus>Completed</OrderStatus>
        <CreatedTime>2018-10-26T15:36:41.000Z</CreatedTime>
      </Order>
      <Order>
        <OrderID>37198277</OrderID>
        <OrderStatus>Completed</OrderStatus>
        <CreatedTime>2018-10-26T15:35:01.000Z</CreatedTime>
      </Order>
      <Order>
        <OrderID>37185515</OrderID>
        <OrderStatus>Completed</OrderStatus>
        <CreatedTime>2018-10-26T16:24:19.000Z</CreatedTime>
      </Order>
    </OrderArray>
  </GetOrdersResponse>
  <?xml version="1.0" encoding="UTF-8"?>
  <GetOrdersResponse xmlns="urn:ebay:apis:eBLBaseComponents">
    <Timestamp>2018-10-26T16:42:58.861Z</Timestamp>
    <Ack>Success</Ack>
    <Version>1083</Version>
    <Build>E1083_CORE_APIXO_18856776_R1</Build>
    <PaginationResult>
      <TotalNumberOfEntries>4</TotalNumberOfEntries>
    </PaginationResult>
    <OrderArray>
      <Order>
        <OrderID>16283499</OrderID>
        <OrderStatus>Completed</OrderStatus>
        <CreatedTime>2018-10-26T15:13:21.000Z</CreatedTime>
      </Order>
      <Order>
        <OrderID>16283499</OrderID>
        <OrderStatus>Completed</OrderStatus>
        <CreatedTime>2018-10-26T15:36:40.000Z</CreatedTime>
      </Order>
      <Order>
        <OrderID>16275107</OrderID>
        <OrderStatus>Completed</OrderStatus>
        <CreatedTime>2018-10-26T16:09:40.000Z</CreatedTime>
      </Order>
      <Order>
        <OrderID>16258277</OrderID>
        <OrderStatus>Completed</OrderStatus>
        <CreatedTime>2018-10-26T16:36:19.000Z</CreatedTime>
      </Order>
    </OrderArray>
  </GetOrdersResponse>
  <?xml version="1.0" encoding="UTF-8"?>
  <GetOrdersResponse xmlns="urn:ebay:apis:eBLBaseComponents">
    <Timestamp>2018-10-26T16:42:59.253Z</Timestamp>
    <Ack>Success</Ack>
    <Version>1083</Version>
    <Build>E1083_CORE_APIXO_18856776_R1</Build>
    <PaginationResult>
      <TotalNumberOfEntries>1</TotalNumberOfEntries>
    </PaginationResult>
    <OrderArray>
      <Order>
        <OrderID>26348797</OrderID>
        <OrderStatus>Completed</OrderStatus>
        <CreatedTime>2018-10-26T15:40:25.000Z</CreatedTime>
      </Order>
    </OrderArray>
  </GetOrdersResponse>

我需要更改所有 &lt;OrderID&gt;&lt;/OrderID&gt; 节点以显示 &lt;Test&gt;&lt;/Test&gt; 并附加到其中的值,我就是这样做的

foreach($auth_tokens as $key => $auth_token) {

    $responses = curl_exec($connection);
    $xml = simplexml_load_string($responses);
    curl_close($connection);

    $entries = $xml->PaginationResult->TotalNumberOfEntries;
    $xml = $xml->OrderArray->Order;

    if($entries == 0) {
        continue;
    } else {

        foreach($xml as $key => $val) {

            $val->Test = substr($val->OrderStatus, 0, 3) . $val->OrderID; // changes the <OrderID> node from <OrderID> to <Test> and appends the first 3 charachters from <OrderStatus> value to the <Test> value
            unset($val->OrderID); // deletes the now empty <OrderID> node

        } // end foreach

    }

echo header('content-type: text/xml');
echo $xml->asXML();

} // end foreach

这正是我需要的输出,除了它只需要一个包裹它的父节点并且它只从每个响应中输出 1 个订单。

<Order>
  <OrderStatus>Completed</OrderStatus>
  <CreatedTime>2018-10-26T15:36:41.000Z</CreatedTime>
  <Test>Com372191926</Test>
</Order>
<Order>
  <OrderStatus>Completed</OrderStatus>
  <CreatedTime>2018-10-26T15:13:21.000Z</CreatedTime>
  <Test>Com16283499</Test>
</Order>
<Order>
  <OrderStatus>Completed</OrderStatus>
  <CreatedTime>2018-10-26T15:40:25.000Z</CreatedTime>
  <Test>Com26348797</Test>
</Order>

但我似乎无法获得父节点,因为我无法成功保存这些数据并在 foreach 循环之外访问它。我很近!

【问题讨论】:

  • 您每次循环都会覆盖$xml。所以在循环之外你只会看到$xml中的最后一个响应
  • @RiggsFolly 是的,我知道。但是.= 无法在循环外访问它。
  • 我想通了。看我的回答。 stackoverflow.com/a/53016076/3950902

标签: php xml simplexml


【解决方案1】:

您可以尝试这样的事情,将响应聚合成一个 XML 字符串,然后在转换之前将其包装在根元素中:

$auth_tokens = array('tok1', 'tok2', 'tok3', 'tok4');
$xmlstr = '';
foreach($auth_tokens as $auth_token) { // 4 iterations in loop
    $response = curl_exec($connection); // API xml response
    $xmlstr .= $response;               // add response to XML
}
$xml = simplexml_load_string("<Orders>$xmlstr</Orders>");
header('content-type: text/xml');
echo $xml->asXML();

更新

如果 XML 响应包含 &lt;?xml ... &gt; 标头,则上述代码不起作用。快速而肮脏的解决方法是使用 preg_replace 将它们删除,即将 $xmlstr .= $response; 更改为

$xmlstr .= preg_replace('/<\?xml[^>]*>/', '', $response);

Demo

“正确”的解决方法是分别处理 XML 响应并将它们作为子项添加到根文档中。这可以使用DomDocument

$xml = new DomDocument();
$xml->loadXML('<Orders></Orders>');
$xmlroot = $xml->documentElement;
$respdoc = new DomDocument();
foreach($auth_tokens as $auth_token) {   // 4 iterations in loop
    $response = curl_exec($connection); // API xml response
    $respdoc->loadXML($response);        // create a domDocument
    $resproot = $respdoc->documentElement;   // get the root element
    $resproot = $xml->importNode($resproot, true); // import into XML
    $xmlroot->appendChild($resproot);
}
header('content-type: text/xml');
echo $xml->saveXML();

Demo

【讨论】:

  • .= 不工作,你测试过吗?什么都没有输出。只有当我在循环中移动最后 3 行代码时,它才会输出。
  • @Mike 我无法完全按照您的使用方式对其进行测试@.
  • @Mike 你能在循环内做一个var_dump$response 吗?这可能有助于调试问题。
  • 我更新了我的问题。我添加了从 api 响应中获得的确切输出格式。因为它是一个 xml 响应,并且我在循环中查询 4 ​​个身份验证令牌,所以我在响应中得到 4 &lt;?xml version="1.0" encoding="UTF-8"?&gt;。我认为这是问题所在。
  • @Mike 你是对的,额外的 xml 标题行是问题所在。给我一分钟,我会解决问题
【解决方案2】:

我发现了这个问题。我需要在子 foreach 循环内连接.=,而不是在父循环内。然后我能够访问循环外的数据。我不得不使用$val-&gt;asXML() 将数据保存到一个变量中。请注意下面代码中的注释行。

foreach($auth_tokens as $key => $auth_token) { // 4 iterations in loop

    $responses = curl_exec($connection); // API xml response
    $xml = simplexml_load_string($responses); // loaded xml into SimpleXMLElement object
    curl_close($connection);

    $entries = $xml->PaginationResult->TotalNumberOfEntries;
    $xml = $xml->OrderArray->Order; // Just get the Order elements

    if($entries == 0) {
        continue;
    } else {

        foreach($xml as $key => $val) {

            $val->Test = substr($val->OrderStatus, 0, 3) . $val->OrderID; // changes the <OrderID> node from <OrderID> to <Test> and appends the first 3 charachters from <OrderStatus> value to the <Test> value
            unset($val->OrderID); // deletes the <OrderID> node

            $orders .= $val->asXML(); // concatenate here in child loop instead of parent foreach

        } // end child foreach

    }

} // end parent foreach

$xml = new DomDocument('1.0', 'utf-8');
$xml->preserveWhiteSpace = false;
$xml->formatOutput = true;
$xml->loadXML('<Orders>' . $orders . '</Orders>'); // able to add my parent node <orders></Orders>
$xml->save('test.xml', LIBXML_NOEMPTYTAG); // saves xml to file

header('content-type: text/xml');
echo $xml->saveXML(); // saves xml for display

输出正是我需要的,没有太多开销,而且格式也很好。

<?xml version="1.0"?>
<Orders>
  <Order>
    <OrderStatus>Completed</OrderStatus>
    <CreatedTime>2018-10-26T15:36:41.000Z</CreatedTime>
    <Test>Com10789</Test>
  </Order>
  <Order>
    <OrderStatus>Completed</OrderStatus>
    <CreatedTime>2018-10-26T15:13:21.000Z</CreatedTime>
    <Test>Com10790</Test>
  </Order>
  <Order>
    <OrderStatus>Completed</OrderStatus>
    <CreatedTime>2018-10-26T15:40:25.000Z</CreatedTime>
    <Test>Com141570</Test>
  </Order>
  <Order>
    <OrderStatus>Completed</OrderStatus>
    <CreatedTime>2018-10-26T15:36:41.000Z</CreatedTime>
    <Test>Com141571</Test>
  </Order>
  <Order>
    <OrderStatus>Completed</OrderStatus>
    <CreatedTime>2018-10-26T15:13:21.000Z</CreatedTime>
    <Test>Com141572</Test>
  </Order>
  <Order>
    <OrderStatus>Completed</OrderStatus>
    <CreatedTime>2018-10-26T15:36:41.000Z</CreatedTime>
    <Test>Com19992</Test>
  </Order>
  <Order>
    <OrderStatus>Completed</OrderStatus>
    <CreatedTime>2018-10-26T15:40:25.000Z</CreatedTime>
    <Test>Com19993</Test>
  </Order>
</Orders>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 2021-01-21
    • 2013-03-27
    • 2012-02-03
    • 1970-01-01
    • 2014-09-15
    相关资源
    最近更新 更多