Задать вопрос
@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>
  • Вопрос задан
  • 257 просмотров
Подписаться 2 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 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 не играет роли)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽