@scotch18
Middle PHP Developer

Как вытащить информацию из XML вне зависимости от используемых неймспейсов?

Есть большое количество XML документов. Для того чтобы вытянуть информацию через SimpleXML требуется обращаться к неймспейсам. «$example = $xml->children($namespaces['ns2'])->children();»

В примере мне неймспейс известен, но что делать, если у документов могут быть разные неймспейсы?

Прикладываю пример XML(полностью не прикладывается, но думаю и так будет понятно). Возможно можно как-то хотяб привести к одному неймспейсу

<?xml version="1.0" encoding="UTF-8" standalone="true"?>

-<ns2:export xmlns:ns3="http://zakupki.gov.ru/oos/common/1" xmlns:ns4="http://zakupki.gov.ru/oos/base/1" xmlns:ns2="http://zakupki.gov.ru/oos/export/1" xmlns:ns10="http://zakupki.gov.ru/oos/printform/1" xmlns:ns11="http://zakupki.gov.ru/oos/control99/1" xmlns:ns9="http://zakupki.gov.ru/oos/SMTypes/1" xmlns:ns7="http://zakupki.gov.ru/oos/pprf615types/1" xmlns:ns8="http://zakupki.gov.ru/oos/EPtypes/1" xmlns:ns5="http://zakupki.gov.ru/oos/TPtypes/1" xmlns:ns6="http://zakupki.gov.ru/oos/CPtypes/1" xmlns="http://zakupki.gov.ru/oos/types/1">


-<ns2:epNotificationEZK schemeVersion="10.2.310">

<ns8:id>24932622</ns8:id>

<ns8:externalId>7CCF91D7-6829-477E-AF7D-A1EE9C3FD3F225</ns8:externalId>

<ns8:versionNumber>1</ns8:versionNumber>


-<ns8:commonInfo>

<ns8:purchaseNumber>0320200009220000111</ns8:purchaseNumber>

<ns8:docNumber>№0320200009220000111</ns8:docNumber>

<ns8:plannedPublishDate>2020-11-01+10:00</ns8:plannedPublishDate>

<ns8:publishDTInEIS>2020-11-01T14:23:40.387+10:00</ns8:publishDTInEIS>

<ns8:href>https://zakupki.gov.ru/epz/order/notice/zk504/view/common-info.html?regNumber=0320200009220000111</ns8:href>

<ns8:purchaseObjectInfo>Поставка светодиодных светильников</ns8:purchaseObjectInfo>


-<ns8:placingWay>

<ns4:code>ZKP504</ns4:code>

<ns4:name>Запрос котировок в электронной форме</ns4:name>

</ns8:placingWay>


-<ns8:ETP>

<ns4:code>ETP_SBAST</ns4:code>

<ns4:name>АО «Сбербанк-АСТ»</ns4:name>

<ns4:url>http://www.sberbank-ast.ru</ns4:url>

</ns8:ETP>

<ns8:contractConclusionOnSt83Ch2>true</ns8:contractConclusionOnSt83Ch2>

</ns8:commonInfo>
  • Вопрос задан
  • 216 просмотров
Решения вопроса 1
@scotch18 Автор вопроса
Middle PHP Developer
Вобщем я получил все неймспейсы в массив и через foreach подбирал нужный мне. Паралельно я открыл для себя xpath, что упростило дело до безумия.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@alexalexes
Читаете каждый узел, определяете его имя, читаете его атрибуты.
Если элемент имеет признаки определителя неймспейсов, например, называется export и имеет атрибуты xmlns:ns*, то это и есть определитель наймспейса. Нашли определитель, останавливаете поиск определителя.
Возможно, для дальнейшего чтения нужно взять этот список атрибутов и искать только этих потомков.
PS: Термин определителя неймспейсов взят от балды. Для такой структуры данных нужна вполне определенная техническая документация, которая должна давать исчерпывающий ответ, как ее использовать.
Ответ написан
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
<ns8:id>24932622</ns8:id>
Можно обработать XML-документ перед парсингом и заменить все <nsN: и </nsN: через preg_replace() чтобы получить одинаковый namespace во всём документе или вообще вырезать все nsN: и тогда получите просто голые аттрибуты (если namespace не играет роли)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы