Если у меня есть объект SimpleXMLElement, который находится внутри цикла foreach, как мне получить к нему доступ вне цикла?
$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:
Ник помог мне понять, как поместить все 4 ответа в один документ XML, но янеобходимо редактировать имена и значения узлов, и это было легко сделать, когда xml находится в объекте SimpleXMLElement.Поэтому я подумал, что сначала можно манипулировать данными, пока они находятся в объекте, а затем, когда я закончу, преобразовать объект обратно в xml и сохранить.Но я столкнулся с проблемами при доступе к объекту вне цикла.Это потому, что есть 4 объекта, а не только 1, поэтому .=
не сохранял данные.
Это то, что API выводит, когда я echo $response;
и просматриваю источник.Это просто чистый 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>
"
Если я использую $xml = simplexml_load_string($response);
в foreach, и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 '<pre>' . var_export($xml, true) . '</pre><br>';
.Я нахожу, что этот легче читать и ясно видеть, что это 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->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>
Мне нужно изменить все <OrderID></OrderID>
узлы для отображения <Test></Test>
и добавить к значению в нем, и я сделал это с этим
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.Я так близко!