WEBDAV XML для объекта / JSON в PHP?

У меня есть ответ webdav PROPFIND xml, который я получаю от OwnCloud. Мне нужно преобразовать в объект PHP (и, в конечном итоге, JSON). Проблема заключается в том, что ответ является тяжелым для пространств имен, которые, очевидно, не очень хорошо справляется с симплексной библиотекой php.

Вот как выглядит XML:

<?xml version="1.0" encoding="utf-8"?>
<d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:oc="http://owncloud.org/ns">
<d:response>
 <d:href>/owncloud/remote.php/webdav/ownCloudUserManual.pdf</d:href>
 <d:propstat>
   <d:prop>
     <d:getlastmodified>Sun, 04 Oct 2015 18:01:18 GMT</d:getlastmodified>
     <d:getcontentlength>2241884</d:getcontentlength>
     <d:resourcetype/>
     <d:getetag>"b00009ac4b1b17c45667abd2a6d2f7c7"</d:getetag>
     <d:getcontenttype>application/pdf</d:getcontenttype>
   </d:prop>
   <d:status>HTTP/1.1 200 OK</d:status>
 </d:propstat>
</d:response>
</d:multistatus>

Когда я делаю это через simplexml, я ничего не получаю обратно:

  $xml = simplexml_load_string($xml);
  print_r( $xml );

Print_r дает:

SimpleXMLElement Object
(
)
{}

Кажется, что нет никаких симплексных ошибок (как возвращено из libxml_get_errors()) - просто ничего не возвращается, кроме пустого класса.

Я мог бы использовать несколько советов о том, как разобрать XML во что-то полезное. Спасибо за любую помощь.

1 ответ

Я только что столкнулся с той же проблемой и узнал, как ее решить. Комментарии выше указывают в правильном направлении, но я хотел показать здесь реальное решение:

вам нужно получить пространства имен, которые выводятся во второй строке XML-кода с помощью «xmlns:..»:

      $ns = $xml->getNamespaces(true);

Затем вы можете выбрать всех дочерних элементов желаемого пространства имен («d») с помощью следующей команды:

      $child = $xml->children($ns['d']);

после этого вы можете перебирать элементы ответа и извлекать информацию из их дочерних элементов:

      foreach ($child->response as $files) {
    echo $files->href . "<br>";
}

это выведет, например, все элементы HREF, в вашем случае «/owncloud/remote.php/webdav/ownCloudUserManual.pdf» и любое другое содержимое каталога.

Другие вопросы по тегам