phpbar.de logo

Mailinglisten-Archive

[php] SimpleXML und WebDAV Namespace

[php] SimpleXML und WebDAV Namespace

Jens Giessmann jg at handcode.de
Mon Jul 2 11:15:03 CEST 2007


Hi,

On Sun, Jul 01, 2007 at 03:45:33PM +0200, Hendrik Bauer wrote:
> 
> Das gleiche funktioniert auch mit SimpleXML:
> 
> $xml = @simplexml_load_string ($response['body']);
> $xml->registerXPathNamespace('D:', 'uri:DAV');
> 
> Allerdings kann man im Anschluss nicht mit
> 
> foreach ($xml->xpath('//D:response') as $response) {
> 
> }
> 
> arbeiten. Denn mit $response->html kommt man immer noch nicht an die
> Elemente. Das seltsame ist zudem, dass $response wie ein loser Knoten
> erscheint, ohne Referenz auf Kinder. Will man z.B. $refs =
> $response->xpath('//D:href') nutzen bekommt man einen arrays aller
> href-Elemente im gesamten Dokument. Ich konnte es zumindest nicht
> möglich machen, sich den Baum so durchzuhangeln.

Wenn du nur die href Kinder unterhalb eines $response Knotens suchst
musst du die // im xpath Query bei $xml->xpath('//D:response' weg
lassen, bzw. noch einen '.' davor setzen wenn du alle hrefs von
D:response und dessen Kindern haben willst.

Beispiele:
--------------------------------schnipp-----------------------------
<?php

$xml = '<?xml version="1.0" encoding="utf-8" ?>
<D:response xmlns:D="DAV:">
  <D:href>/webdav/</D:href>
  <D:prop xmlns:R="http://www.foo.bar/boxschema/">
    <D:href>/prop-href1/</D:href>
    <R:author>author1</R:author>
  </D:prop>

  <D:href>/webdav2/</D:href>
  <D:prop xmlns:R="http://www.foo.bar/boxschema/">
    <D:href>/prop-href2/</D:href>
    <R:author>author2</R:author>
  </D:prop>
</D:response>';

$sxml = @simplexml_load_string ($xml);

$sxml->registerXPathNamespace('D', 'DAV:');
$sxml->registerXPathNamespace('R:', 'http://www.foo.bar/boxschema/');

// alle direkten href-Kinder von D:response
foreach($sxml->xpath('//D:response') as $response) {
  print_r($response->xpath('D:href'));
}

// alle href-Kinder von D:response und dessen Kindern
foreach($sxml->xpath('//D:response') as $response) {
  print_r($response->xpath('.//D:href'));
}

// Alle href-Kinder von D:prop Kindern von D:response
foreach($sxml->xpath('//D:response/D:prop') as $prop) {
  print_r($prop->xpath('./D:href'));
}

// Werte der R:author Tags der D:prop ausgeben.
foreach ($sxml->xpath('//D:prop') as $prop) {
  $res = $prop->xpath('R:author');
  echo $res[0] . "\n";
}

?>
--------------------------------schnapp-----------------------------


Gruss Jens

php::bar PHP Wiki   -   Listenarchive