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» и любое другое содержимое каталога.