Вы можете легко решить эту проблему с помощью XPath .
XPath позволяет запрашивать узлы в документе практически в любой возможной комбинации. Чтобы запросить значение геокода, которому предшествует элемент valueName с содержимым FIPS6 , вы можете использовать этот запрос:
/alert/info/area/geocode/value[preceding-sibling::valueName = "FIPS6"]
Однако документ имеет по умолчанию пространство имен для элемента оповещения (как указано атрибутом xmlns). По умолчанию SimpleXml не сможет получить доступ к каким-либо узлам пространства имен в документе через XPath, пока мы не сообщим ему пространство имен через registerXPathNamespace
и не префиксим любые элементы в запросе с произвольным префиксом.
Результатом XPath будет массив, содержащий SimpleXmlElements. Когда вы приводите SimpleXmlElement к строке (или используете его в строковом контексте), он возвращает его nodeValue, то есть значения, которые вы на самом деле хотите объединить, так что вы можете просто вызвать implode
в полученном массиве, чтобы объединить значения в строка.
$alert = simplexml_load_file('http://…');
$alert->registerXPathNamespace('a', 'urn:oasis:names:tc:emergency:cap:1.1');
$fipsValues = implode(',', $alert->xpath(
'/a:alert/a:info/a:area/a:geocode/a:value[
preceding-sibling::a:valueName = "FIPS6"
]'
));
print_r($fipsValues); // will contain "001033,001077"