Go to the documentation of this file.00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00031 class SQL2XML
00032 {
00039 var $domxml;
00040
00047 var $obj_id;
00048
00055 var $mapping;
00056
00057 var $doc;
00064 var $hash;
00065
00072 var $db;
00073
00074 var $nestedset;
00081 function SQL2XML ($database_connection, $a_obj_id)
00082 {
00083 $this->db = $database_connection;
00084 $this->obj_id = $a_obj_id;
00085 $this->getXMLDocument();
00086 register_shutdown_function(array(&$this, '_SQL2XML'));
00087 }
00088
00089 function _SQL2XML() {
00090 if ($this->doc) {
00091 $this->doc->free();
00092 }
00093 }
00094
00095 function retrieveHeader() {
00096 $q = sprintf("SELECT * FROM xml_object WHERE ID=%s",
00097 $this->db->quote($this->obj_id)
00098 );
00099 $result = $this->db->query($q);
00100 if ($row = $result->fetchRow(DB_FETCHMODE_OBJECT)) {
00101 return "<?xml version=\"$row->version\" encoding=\"$row->encoding\"?>";
00102 } else {
00103 return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
00104 }
00105 }
00106
00114 function getXMLDocument()
00115 {
00116 $this->nestedset = $this->getStructure($this->obj_id);
00117
00118 $xmlHeader = $this->retrieveHeader() . "<root />";
00119
00120 $this->doc = domxml_open_mem($xmlHeader);
00121
00122 $root = $this->doc->document_element();
00123 $root->unlink_node();
00124
00125 $this->buildXML();
00126 return $this->doc->dump_mem(true);
00127 }
00128
00129 function buildXML ()
00130 {
00131 foreach ($this->nestedset as $key => $node_data)
00132 {
00133 $insert = false;
00134 switch ($node_data["node_type_id"])
00135 {
00136 case XML_ELEMENT_NODE:
00137 $node = $this->doc->create_element($node_data["element"]);
00138
00139 if (is_array($node_data["attr_list"]))
00140 {
00141 foreach ($node_data["attr_list"] as $attr => $value)
00142 {
00143 $node->set_attribute($attr, $value);
00144 }
00145 }
00146 $insert = true;
00147 break;
00148 case XML_TEXT_NODE:
00149 $node = $this->doc->create_text_node($node_data["textnode"]);
00150 $insert = true;
00151 break;
00152 case XML_COMMENT_NODE:
00153 $node = $this->doc->create_comment($node_data["comment"]);
00154 $insert = true;
00155 break;
00156 }
00157
00158 if ($insert)
00159 {
00160
00161 $parent = $this->hash[$node_data["parent_node_id"]];
00162
00163 if (!$parent) {
00164 $node = $this->doc->append_child($node);
00165 } else {
00166 $node = $parent->append_child($node);
00167 }
00168 $this->hash[$this->nestedset[$key]["node_id"]] = $node;
00169 }
00170 }
00171 }
00172
00173 function getStructure($a_xml_id)
00174 {
00175 $q = "SELECT lo.node_id, lo.node_type_id, lo.xml_id, lo.parent_node_id, lo.struct, tx.textnode, comm.comment, el.element, a_name.attribute, a_value.value ".
00176 "FROM xml_tree AS lo ".
00177 "LEFT OUTER JOIN xml_element_idx AS e_idx ON lo.node_id = e_idx.node_id ".
00178 "LEFT OUTER JOIN xml_element_name AS el ON e_idx.element_id = el.element_id ".
00179 "LEFT OUTER JOIN xml_text AS tx ON lo.node_id = tx.node_id ".
00180 "LEFT OUTER JOIN xml_comment AS comm ON lo.node_id = comm.node_id " .
00181 "LEFT OUTER JOIN xml_attribute_idx AS a_idx ON lo.node_id = a_idx.node_id ".
00182 "LEFT JOIN xml_attribute_name AS a_name ON a_idx.attribute_id=a_name.attribute_id ".
00183 "LEFT JOIN xml_attribute_value AS a_value ON a_idx.value_id=a_value.value_id ".
00184 "WHERE xml_id='".$a_xml_id."' ".
00185 "ORDER BY lft ASC";
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287 $res = $this->db->query($q);
00288 while ($row = $res->fetchRow(DB_FETCHMODE_ASSOC))
00289 {
00290 $data[$row["node_id"]] = $row;
00291
00292 if ($row["struct"] & 1)
00293 {
00294 $tmp[$row["node_id"]][] = array ($row["attribute"] => $row["value"]);
00295 }
00296 }
00297
00298 foreach ($tmp as $node_id => $node)
00299 {
00300 $attr_list = array();
00301
00302 foreach ($node as $attr)
00303 {
00304
00305 $attr_list[key($attr)] = $attr[key($attr)];
00306 }
00307
00308 $data[$node_id]["attr_list"] = $attr_list;
00309 }
00310 return $data;
00311 }
00312
00313
00323 function getTree ($a_lo_id)
00324 {
00325 return $tree;
00326 }
00327
00336 function getNode ($a_node_id)
00337 {
00338 return $node;
00339 }
00340
00348 function getElementName ($a_node_id)
00349 {
00350 $q = "SELECT leaf_text FROM xml_element_name_leaf ".
00351 "WHERE node_id='".$a_node_id."' LIMIT 1";
00352
00353 $res = $this->db->getRow($q, DB_FETCHMODE_ASSOC);
00354
00355 return $res["leaf_text"];
00356 }
00357
00358 function getElementText ($a_node_id)
00359 {
00360 $q = "SELECT leaf_text FROM xml_text_leaf ".
00361 "WHERE node_id='".$a_node_id."' LIMIT 1";
00362
00363 $res = $this->db->getRow($q, DB_FETCHMODE_ASSOC);
00364
00365 return $res["leaf_text"];
00366 }
00375 function getAttributes ($a_node_id)
00376 {
00377 $q = "SELECT a_name.attribute,a_value.value ".
00378 "FROM xml_attribute_idx AS a_idx ".
00379 "LEFT JOIN xml_attribute_name AS a_name ON a_idx.attribute_id=a_name.attribute_id ".
00380 "LEFT JOIN xml_attribute_value AS a_value ON a_idx.value_id=a_value.value_id ".
00381 "WHERE a_idx.node_id = '".$a_node_id."'";
00382
00383
00384
00385 $res = $this->db->query($q);
00386
00387 if ($res->numRows())
00388 {
00389 while ($row = $res->fetchRow(DB_FETCHMODE_ASSOC))
00390 {
00391 $data[$row["attribute"]] = $row["value"];
00392 }
00393
00394 return $data;
00395 }
00396
00397 return false;
00398 }
00399
00400
00409 function getAttributeValue ($a_lo_id,$a_element,$a_attribute)
00410 {
00411
00412 $q = "SELECT a_value.value ".
00413 "FROM xml_tree AS lo ".
00414 "LEFT JOIN lo_element_idx AS e_idx ON lo.node_id = e_idx.node_id ".
00415 "LEFT JOIN lo_element_name AS el ON e_idx.element_id = el.element_id ".
00416 "LEFT JOIN lo_attribute_idx AS a_idx ON lo.node_id = a_idx.node_id ".
00417 "LEFT JOIN lo_attribute_name AS a_name ON a_idx.attribute_id=a_name.attribute_id ".
00418 "LEFT JOIN lo_attribute_value AS a_value ON a_idx.value_id=a_value.value_id ".
00419 "WHERE xml_id = '".$a_lo_id."' ".
00420 "AND lo.struct > 0 ".
00421 "AND el.element = '".$a_element."' ".
00422 "AND a_name.attribute = '".$a_attribute."'";
00423
00424
00425
00426 $res = $this->db->query($q);
00427 $row = $res->fetchRow();
00428
00429 return $row[0];
00430 }
00431
00432 }
00433
00434 ?>