Как разобрать ответ eXist XQuery с PHP? - PullRequest
0 голосов
/ 22 сентября 2010

Я пытаюсь найти простой способ анализа ответа eXist с php без установки сторонних классов.

Это тип ответа, который я хотел бы проанализировать:

<exist:result xmlns:exist="http://exist.sourceforge.net/NS/exist">
  <exist:collection name="xData" path="/db/SBXXX/00000000-00000000/sapData" created="2010-07-15T16:12:09.135-05:00">
    <exist:resource name="xDataData1.xml" size="1565" created="1969-12-31T18:00:00.000-06:00" last-modified="2010-09-20T23:42:09.584-05:00"/>
    <exist:resource name="xDataData10.xml" size="805" created="1969-12-31T18:00:00.000-06:00" last-modified="2010-09-21T01:27:09.614-05:00"/>
    <exist:resource name="xDataData11.xml" size="806" created="1969-12-31T18:00:00.000-06:00" last-modified="2010-09-21T01:27:22.005-05:00"/>
    <exist:resource name="xDataData12.xml" size="1565" created="1969-12-31T18:00:00.000-06:00" last-modified="2010-09-21T01:42:15.768-05:00"/>
    <exist:resource name="xDataData13.xml" size="805" created="1969-12-31T18:00:00.000-06:00" last-modified="2010-09-21T01:57:09.749-05:00"/>
  </exist:collection>
</exist:result>

Я пытаюсь использовать функцию simplexml_load_string php, но получаю пустой объект SimpleXMLElement без ошибок.

Я хотел бы получить из этого ответа список файлов XML.

Спасибо

Ответы [ 2 ]

1 голос
/ 22 сентября 2010

Использование DOMDocument и DOMXPath является наиболее «правильным» способом доступа к этим атрибутам:

$xml = '<exist:result xmlns:exist="http://exist.sourceforge.net/NS/exist">
  <exist:collection name="xData">
    <exist:resource name="xDataData1.xml"/>
    <exist:resource name="xDataData10.xml"/>
  </exist:collection>
</exist:result>
';

$dom = DOMDocument::loadXML($xml);
$xpath = new DOMXPath($dom);
$xpath->registerNamespace('exist', 'http://exist.sourceforge.net/NS/exist');

$nodes = $xpath->query('exist:collection/exist:resource');
if (!$nodes->length)
  exit('No nodes found');

$items = array();
foreach ($nodes as $node)
  $items[] = $node->getAttribute('name');

print_r($items);

Который производит это:

Array
(
    [0] => xDataData1.xml
    [1] => xDataData10.xml
)
1 голос
/ 22 сентября 2010

установить пространство имен и использовать xpath:

    $xml = '<exist:result xmlns:exist="http://exist.sourceforge.net/NS/exist">
  <exist:collection name="xData" path="/db/SBXXX/00000000-00000000/sapData" created="2010-07-15T16:12:09.135-05:00">
    <exist:xmlObject name="xDataData1.xml" size="1565" created="1969-12-31T18:00:00.000-06:00" last-modified="2010-09-20T23:42:09.584-05:00"/>
    <exist:resource name="xDataData10.xml" size="805" created="1969-12-31T18:00:00.000-06:00" last-modified="2010-09-21T01:27:09.614-05:00"/>
    <exist:resource name="xDataData11.xml" size="806" created="1969-12-31T18:00:00.000-06:00" last-modified="2010-09-21T01:27:22.005-05:00"/>
    <exist:resource name="xDataData12.xml" size="1565" created="1969-12-31T18:00:00.000-06:00" last-modified="2010-09-21T01:42:15.768-05:00"/>
    <exist:resource name="xDataData13.xml" size="805" created="1969-12-31T18:00:00.000-06:00" last-modified="2010-09-21T01:57:09.749-05:00"/>
  </exist:collection>
</exist:result>';
$xmlObject = simplexml_load_string($xml);
$xmlObject->registerXPathNamespace('e','http://exist.sourceforge.net/NS/exist');
var_dump($xmlObject->xpath('//e:resource'));
...