Вы последовали очень плохому совету о том, как разобрать XML, и полностью отбросили функциональность Simple XML.
В частности, причина, по которой вы не можете запустить attributes()
Метод заключается в том, что вы преобразовали объект Simple XML в простой массив с помощью этого уродливого хака:
$array = json_decode( str_replace('@', '', json_encode((array)$body)), TRUE);
Чтобы использовать Simple XML по назначению авторов, я предлагаю вам прочитать:
Так как вы не вставили фактический XML в вопрос, я собираюсь предположить, что это выглядит так:
<?xml version = "1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope">
<soap:Body xmlns="http://www.example.org/companyInfo">
<GetCompanyCodeResponse>
<GetCompanyCodeResult>
<Customers>
<Customer CustomerNo="103987" CustomerName="epds api testers Inc" ContactId="219196" />
</Customers>
</GetCompanyCodeResult>
</GetCompanyCodeResponse>
</soap:Body>
</soap:Envelope>
Если это в $response
, мы не нужно сделать какие-то странности с str_replace
или json_encode
, мы можем использовать методы, встроенные в Simple XML, для навигации по XML:
$xml = new SimpleXMLElement($response);
// The Body is in the SOAP Envelope namespace
$body = $xml->children('http://www.w3.org/2001/12/soap-envelope')->Body;
// The element inside that is in some other namespace
$innerResponse = $body->children('http://www.example.org/companyInfo')->GetCompanyCodeResponse;
// We need to traverse the XML to get to the node we're interested in
$customer = $innerResponse->GetCompanyCodeResult->Customers->Customer;
// Unprefixed attributes aren't technically in any namespace (an oddity in the XML namespace spec!)
$attributes = $customer->attributes(null);
// Here's the value you were looking for
echo $attributes['ContactId'];
В отличие от вашего предыдущего кода, это выиграло ' t break, если:
- Сервер начинает использовать другой локальный префикс вместо
soap:
или добавляет префикс на GetCompanyCodeResponse
element - Ответ возвращается с более чем одним
Customer
(->Customer
всегда означает то же самое, что и ->Customer[0]
, первый дочерний элемент с таким именем) - Элемент
Customer
имеет дочерние элементы или текстовое содержимое, а также атрибуты
Он также позволяет использовать другие функции Simple XML, например , с использованием выражения xpath
для поиска в document или даже переход на полный DOM API для более сложных операций .