Синтаксический анализ XML-запроса Caldav в php

#php #xml #caldav

#php #xml #caldav

Вопрос:

Я пытаюсь проанализировать запрос, отправленный ThunderBird на мой сервер CalDAV, и из примера, взятого из stackoverflow, с помощью XML, подобного :

 <?xml version="1.0" encoding="ISO-8859-1"?>
<products>
    <last_updated>2009-11-30 13:52:40</last_updated>
    <product>
        <element_1>foo</element_1>
        <element_2>foo</element_2>
        <element_3>foo</element_3>
        <element_4>foo</element_4>
    </product>
</products> 
  

Использование функции :

 $XMLr = new XMLReader;
$XMLr->open('test.xml');

$doc = new DOMDocument;

// move to the first <product /> node
while ($XMLr->read() amp;amp; $XMLr->name !== 'product');


// now that we're at the right depth, hop to the next <product/> until the end of the tree
    $node = simplexml_import_dom($doc->importNode($XMLr->expand(), true));

    // now you can use $node without going insane about parsing
    $children = $node->children();
    foreach($children as $child)
    {
        echo $child->getName();
        echo "n";
    }
  

Я получаю ответ «элемент_1 элемент_2 элемент_3 элемент_4», но если я использую ту же функцию в своем запросе :

 <?xml version="1.0" encoding="UTF-8"?>
<D:propfind xmlns:D="DAV:" xmlns:CS="http://calendarserver.org/ns/" xmlns:C="urn:ietf:params:xml:ns:caldav">
    <D:prop>
        <D:resourcetype/>
        <D:owner/>
        <D:current-user-principal/>
        <D:supported-report-set/>
        <C:supported-calendar-component-set/>
        <CS:getctag/>
    </D:prop>
</D:propfind>
  

Заменив $ XMLr-> name !== ‘product’ на $XMLr-> name !== ‘D: prop’, я получаю белый экран…

Что я делаю не так? Как я могу получить ответ «владелец текущего источника-пользователь-участник и т. Д. …»?

Ответ №1:

Я пытаюсь с XMLReader успехом и simplexml_import_dom без успеха, но наоборот, с DOMDocument вы можете это сделать:

 // Just for display test results
$break_line = '<br>';
if (php_sapi_name() === 'cli') {
  $break_line = "n";
}

$xml = '<?xml version="1.0" encoding="UTF-8"?>
<D:propfind xmlns:D="DAV:" xmlns:CS="http://calendarserver.org/ns/" xmlns:C="urn:ietf:params:xml:ns:caldav">
    <D:prop>
        <D:resourcetype/>
        <D:owner/>
        <D:current-user-principal/>
        <D:supported-report-set/>
        <C:supported-calendar-component-set/>
        <CS:getctag/>
    </D:prop>
</D:propfind>';

$xml_document = new DomDocument(); // http://fr2.php.net/manual/fr/class.domdocument.php
$xml_document->loadXML($xml); // Or load file with $xml_document->load('test.xml);
$elements = $xml_document->getElementsByTagName('prop'); 
// $elements is a DOMNodeList object: http://fr2.php.net/manual/fr/class.domnodelist.php
foreach($elements as $element) {
  // $element is a DOMElement object: http://fr2.php.net/manual/fr/class.domelement.php
  $childs = $element->childNodes;
  // $childs is DOMNodeList
  foreach ($childs as $child) {
    // $element is a DOMElement object
    if ($child instanceof DOMElement) {
      echo $child->nodeName . $break_line;
    }
  }

}
  

Ответ №2:

Белый экран обычно означает ошибку.

Поместите error_reporting в E_ALL

 error_reporting('E_ALL');