danielebarchiesi@4
|
1 <?php
|
danielebarchiesi@4
|
2 /*
|
danielebarchiesi@4
|
3 homepage: http://arc.semsol.org/
|
danielebarchiesi@4
|
4 license: http://arc.semsol.org/license
|
danielebarchiesi@4
|
5
|
danielebarchiesi@4
|
6 class: ARC2 SPARQL Result XML Parser
|
danielebarchiesi@4
|
7 author: Benjamin Nowack
|
danielebarchiesi@4
|
8 version: 2010-11-16
|
danielebarchiesi@4
|
9 */
|
danielebarchiesi@4
|
10
|
danielebarchiesi@4
|
11 ARC2::inc('LegacyXMLParser');
|
danielebarchiesi@4
|
12
|
danielebarchiesi@4
|
13 class ARC2_SPARQLXMLResultParser extends ARC2_LegacyXMLParser {
|
danielebarchiesi@4
|
14
|
danielebarchiesi@4
|
15 function __construct($a, &$caller) {
|
danielebarchiesi@4
|
16 parent::__construct($a, $caller);
|
danielebarchiesi@4
|
17 }
|
danielebarchiesi@4
|
18
|
danielebarchiesi@4
|
19 function __init() {/* reader */
|
danielebarchiesi@4
|
20 parent::__init();
|
danielebarchiesi@4
|
21 $this->srx = 'http://www.w3.org/2005/sparql-results#';
|
danielebarchiesi@4
|
22 $this->nsp[$this->srx] = 'srx';
|
danielebarchiesi@4
|
23 $this->allowCDataNodes = 0;
|
danielebarchiesi@4
|
24 }
|
danielebarchiesi@4
|
25
|
danielebarchiesi@4
|
26 /* */
|
danielebarchiesi@4
|
27
|
danielebarchiesi@4
|
28 function done() {
|
danielebarchiesi@4
|
29 }
|
danielebarchiesi@4
|
30
|
danielebarchiesi@4
|
31 /* */
|
danielebarchiesi@4
|
32
|
danielebarchiesi@4
|
33 function getVariables() {
|
danielebarchiesi@4
|
34 $r = array();
|
danielebarchiesi@4
|
35 foreach ($this->nodes as $node) {
|
danielebarchiesi@4
|
36 if ($node['tag'] == $this->srx . 'variable') {
|
danielebarchiesi@4
|
37 $r[] = $node['a']['name'];
|
danielebarchiesi@4
|
38 }
|
danielebarchiesi@4
|
39 }
|
danielebarchiesi@4
|
40 return $r;
|
danielebarchiesi@4
|
41 }
|
danielebarchiesi@4
|
42
|
danielebarchiesi@4
|
43 function getRows() {
|
danielebarchiesi@4
|
44 $r = array();
|
danielebarchiesi@4
|
45 $index = $this->getNodeIndex();
|
danielebarchiesi@4
|
46 foreach ($this->nodes as $node) {
|
danielebarchiesi@4
|
47 if ($node['tag'] == $this->srx . 'result') {
|
danielebarchiesi@4
|
48 $row = array();
|
danielebarchiesi@4
|
49 $row_id = $node['id'];
|
danielebarchiesi@4
|
50 $bindings = isset($index[$row_id])? $index[$row_id] : array();
|
danielebarchiesi@4
|
51 foreach ($bindings as $binding) {
|
danielebarchiesi@4
|
52 $row = array_merge($row, $this->getBinding($binding));
|
danielebarchiesi@4
|
53 }
|
danielebarchiesi@4
|
54 if ($row) {
|
danielebarchiesi@4
|
55 $r[] = $row;
|
danielebarchiesi@4
|
56 }
|
danielebarchiesi@4
|
57 }
|
danielebarchiesi@4
|
58 }
|
danielebarchiesi@4
|
59 return $r;
|
danielebarchiesi@4
|
60 }
|
danielebarchiesi@4
|
61
|
danielebarchiesi@4
|
62 function getBinding($node) {
|
danielebarchiesi@4
|
63 $r = array();
|
danielebarchiesi@4
|
64 $index = $this->getNodeIndex();
|
danielebarchiesi@4
|
65 $var = $node['a']['name'];
|
danielebarchiesi@4
|
66 $term = $index[$node['id']][0];
|
danielebarchiesi@4
|
67 $r[$var . ' type'] = preg_replace('/^uri$/', 'uri', substr($term['tag'], strlen($this->srx)));
|
danielebarchiesi@4
|
68 $r[$var] = ($r[$var . ' type'] == 'bnode') ? '_:' . $term['cdata'] : $term['cdata'];
|
danielebarchiesi@4
|
69 if (isset($term['a']['datatype'])) {
|
danielebarchiesi@4
|
70 $r[$var . ' datatype'] = $term['a']['datatype'];
|
danielebarchiesi@4
|
71 }
|
danielebarchiesi@4
|
72 elseif (isset($term['a'][$this->xml . 'lang'])) {
|
danielebarchiesi@4
|
73 $r[$var . ' lang'] = $term['a'][$this->xml . 'lang'];
|
danielebarchiesi@4
|
74 }
|
danielebarchiesi@4
|
75 return $r;
|
danielebarchiesi@4
|
76 }
|
danielebarchiesi@4
|
77
|
danielebarchiesi@4
|
78 function getBooleanInsertedDeleted() {
|
danielebarchiesi@4
|
79 foreach ($this->nodes as $node) {
|
danielebarchiesi@4
|
80 if ($node['tag'] == $this->srx . 'boolean') {
|
danielebarchiesi@4
|
81 return ($node['cdata'] == 'true') ? array('boolean' => true) : array('boolean' => false);
|
danielebarchiesi@4
|
82 }
|
danielebarchiesi@4
|
83 elseif ($node['tag'] == $this->srx . 'inserted') {
|
danielebarchiesi@4
|
84 return array('inserted' => $node['cdata']);
|
danielebarchiesi@4
|
85 }
|
danielebarchiesi@4
|
86 elseif ($node['tag'] == $this->srx . 'deleted') {
|
danielebarchiesi@4
|
87 return array('deleted' => $node['cdata']);
|
danielebarchiesi@4
|
88 }
|
danielebarchiesi@4
|
89 elseif ($node['tag'] == $this->srx . 'results') {
|
danielebarchiesi@4
|
90 return '';
|
danielebarchiesi@4
|
91 }
|
danielebarchiesi@4
|
92 }
|
danielebarchiesi@4
|
93 return '';
|
danielebarchiesi@4
|
94 }
|
danielebarchiesi@4
|
95
|
danielebarchiesi@4
|
96 /* */
|
danielebarchiesi@4
|
97
|
danielebarchiesi@4
|
98 function getStructure() {
|
danielebarchiesi@4
|
99 $r = array('variables' => $this->getVariables(), 'rows' => $this->getRows());
|
danielebarchiesi@4
|
100 /* boolean|inserted|deleted */
|
danielebarchiesi@4
|
101 if ($sub_r = $this->getBooleanInsertedDeleted()) {
|
danielebarchiesi@4
|
102 foreach ($sub_r as $k => $v) {
|
danielebarchiesi@4
|
103 $r[$k] = $v;
|
danielebarchiesi@4
|
104 }
|
danielebarchiesi@4
|
105 }
|
danielebarchiesi@4
|
106 return $r;
|
danielebarchiesi@4
|
107 }
|
danielebarchiesi@4
|
108
|
danielebarchiesi@4
|
109 /* */
|
danielebarchiesi@4
|
110
|
danielebarchiesi@4
|
111
|
danielebarchiesi@4
|
112 }
|