PHP 中的 WEBDAV xml 到 object/json?

问题描述 投票:0回答:1

我从 OwnCloud 获得了 webdav PROPFIND xml 响应。我需要转换为 PHP 对象(最终是 json)。问题是响应中充满了名称空间,而 php 的 simplexml 显然不能很好地处理。

这就是 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
(
)
{}

似乎没有任何 simplexml 错误(从 libxml_get_errors() 返回) - 除了空类之外什么也没有返回。

我可以使用一些关于如何将 XML 解析为“有用的东西”的建议。感谢您的帮助。

php webdav owncloud simplexml
1个回答
0
投票

您需要使用“xmlns:..”获取在 XML 代码的第二行中推断出的命名空间:

$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”和任何其他目录内容。

© www.soinside.com 2019 - 2024. All rights reserved.