我从 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 解析为“有用的东西”的建议。感谢您的帮助。
您需要使用“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”和任何其他目录内容。