ILIAS  Release_4_0_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.ilDOMXML.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 
15 class ilDOMXML
16 {
23  var $doc;
24 
31  var $tree;
32 
40  var $error;
41 
58  function ilDOMXML ()
59  {
60  $num = func_num_args();
61  $args = func_get_args();
62 
63  if (($num == 1) && is_object($args[0]))
64  {
65  $this->doc = $args[0];
66  }
67  else
68  {
69  $this->initNewDocument($args[0],$args[1],$args[2]);
70  }
71  }
72 
73  function _ilDOMXML ()
74  {
75  if (DEBUG)
76  {
77  printf("domxml destructor called, class=%s\n", get_class($this)."<br/>");
78  }
79  }
80 
81 
82 
92  function initNewDocument ($a_version = "", $a_encoding = "", $a_charset = "")
93  {
94  if (!$a_version) {
95  $a_version = "1.0";
96  }
97 
98  if (!$a_encoding) {
99  $a_encoding = "UTF-8";
100  }
101 
102  if (!$a_charset) {
103  $a_charset = "UTF-8";
104  }
105 
106  // create the xml string (workaround for domxml_new_doc) ***
107  $xmlHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>". // *** ISO-8859-1
108  "<root />"; // dummy node
109 
110  // create a domxml document object
111  $this->doc = domxml_open_mem($xmlHeader); // *** Fehlerabfrage
112 
113  // delete dummy node
114  $root = $this->doc->document_element();
115  $root->unlink_node();
116 
117  //$this->doc = new_xmldoc($a_version);
118  $this->setEncoding($a_encoding);
119  $this->setCharset($a_charset);
120  }
121 
131  function createRootElement ($a_element)
132  {
133  // check if rootNode already exists
134  if ($root = $this->getRoot()) {
135  return false;
136  }
137 
138  return $this->appendChild($this->createElement($a_element));
139  }
140 
152  function loadDocument ($a_filename, $a_filepath, $a_validate = false)
153  {
154  if ($a_validate) {
155  $mode = DOMXML_LOAD_VALIDATING;
156  } else {
157  $mode = DOMXML_LOAD_PARSING;
158  }
159 
160  $this->doc = domxml_open_file($a_filepath . "/" . $a_filename, $mode, $this->error);
161 
162  // stop parsing if an error occured
163  if ($this->error) {
164  $error_msg = "Error(s) while parsing the document!<br><br>";
165 
166  foreach ($this->error as $error) {
167  $error_msg .= $error["errormessage"]." in line: ".$error["line"]."<br>";
168  }
169 
170  // error handling with ilias object?
171  echo $error_msg;
172  exit();
173  }
174 
175  // set encoding to UTF-8 if empty
176  $this->setEncoding("iso-8859-1",true);
177  // set charset to UTF-8
178  $this->setCharset("iso-8859-1");
179 
180  return $this->doc;
181  }
182 
190  function trim ($a_node)
191  {
192  if ($a_node->has_child_nodes()) {
193  $childs = $a_node->child_nodes();
194 
195  foreach ($childs as $child) {
196  $content = trim($child->get_content());
197 
198  if (empty($content)) {
199  $child->unlink_node();
200  } else {
201  $this->trim($child);
202  }
203  }
204  }
205  }
206 
215  function trimDocument ($a_node = '')
216  {
217  if (empty($a_node)) {
218  $a_node = $this->doc;
219  }
220 
221  $this->trim($a_node);
222  return $a_node;
223  }
224 
246  function transform ($node, $left2 = -1, $lvl = 0)
247  {
248  static $left;
249 
250  // set depth
251  $lvl++;
252 
253  // start value given from outside?
254  if ($left2 > 0) {
255  $left = $left2;
256  }
257  // set default value 1 if no value given
258  if (!$left) {
259  $left = 1;
260  }
261 
262  $node2 = (array)$node;
263 
264  // init structure data
265  // provides additional information about document structure
266  // bitwise:
267  // 1: has attributes
268  // 2: has text element
269  $this->tree[$node2[0]]["struct"] = 0;
270 
271  if ($parent = $node->parent_node()) {
272  $parent = (array)$parent;
273  }
274 
275  if ($first = $node->first_child())
276  {
277  $first = (array)$first;
278  }
279 
280  if ($prev = $node->previous_sibling()) {
281  $prev = (array)$prev;
282  }
283 
284  if ($next = $node->next_sibling()) {
285  $next = (array)$next;
286  }
287 
288  $this->tree[$node2[0]]["content"] = trim($node->node_value());
289  $this->tree[$node2[0]]["name"] = $node->node_name();
290  $this->tree[$node2[0]]["type"] = $node->type;
291  $this->tree[$node2[0]]["depth"] = $lvl;
292  $this->tree[$node2[0]]["parent"] = $parent[0];
293  $this->tree[$node2[0]]["first"] = $first[0];
294  $this->tree[$node2[0]]["prev"] = $prev[0];
295  $this->tree[$node2[0]]["next"] = $next[0];
296  $this->tree[$node2[0]]["left"] = $left;
297  $left++;
298 
299  // write attributes to sub-array
300  if ($node->has_attributes())
301  {
302  $data = "";
303 
304  foreach ($node->attributes() as $attribute)
305  {
306  $data[$attribute->name] = $attribute->value;
307  }
308 
309  $this->tree[$node2[0]]["attr_list"] = $data;
310  $this->tree[$node2[0]]["struct"] += 1;
311  }
312 
313  // check if one child is a text_node
314  foreach ($node->child_nodes() as $child)
315  {
316  if ($child->node_type() == XML_TEXT_NODE)
317  {
318  $this->tree[$node2[0]]["struct"] += 2;
319  break;
320  }
321  }
322 
323  // recursive call
324  // please don't merge this loop with the one above together!
325  foreach ($node->child_nodes() as $child)
326  {
327  $this->transform($child, $left, $lvl);
328  }
329 
330  $this->tree[$node2[0]]["right"] = $left;
331  $left++;
332  }
333 
344  function buildTree ($a_node = "")
345  {
346  if (empty($a_node)) {
347  $a_node = $this->doc;
348  }
349 
350  $this->transform($a_node,1);
351 
352  return $this->tree;
353  }
354 
367  function dumpDocument ($a_stdout = -1, $a_compress = false, $a_format = false)
368  {
369  if ($a_stdout != -1) {
370  $this->doc->dump_file($a_stdout,$a_compress,$a_format);
371  }
372 
373  return $this->doc->dump_mem();
374  }
375 
388  function getTextFromElement ($a_element)
389  {
390  if ($a_element->node_type() == XML_ELEMENT_NODE) {
391  $value = "";
392 
393  foreach ($a_element->child_nodes() as $child) {
394  if ($child->node_type() == XML_TEXT_NODE) {
395  $value .= $child->content;
396  }
397  }
398 
399  return trim($value);
400  }
401 
402  die("<b>".$a_element."</b> is not a valid element node!");
403  }
404 
415  function isLeafElement ($a_node, $a_elementname, $a_num = 0)
416  {
417  $var = true;
418 
419  if ($childs = $a_node->child_nodes()) {
420  foreach ($childs as $child) {
421  $var = $this->isLeafElement($child, $a_elementname);
422 
423  if (!$var) {
424  return false;
425  }
426  }
427  }
428 
429  if (($a_node->node_type() == XML_ELEMENT_NODE) && ($a_node->tagname == $a_elementname) && ($a_num != 1)) {
430  return false;
431  }
432 
433  return $var;
434  }
435 
447  function getElementsByTagname ($a_elementname, $a_node = "")
448  {
449  if (empty($a_node)) {
450  $a_node = $this->doc;
451  }
452 
453  if (count($node = $a_node->get_elements_by_tagname($a_elementname)) > 0) {
454  return $node;
455  }
456 
457  return false;
458  }
459 
470  function appendReferenceNodeForLO ($a_node, $a_lo_id, $a_lm_id, $a_prev_sibling)
471  {
472  $newnode = $this->createElement("LO");
473 
474  if (empty($a_prev_sibling))
475  {
476  $node = $a_node->append_child($newnode);
477  }
478  else
479  {
480  $node = $a_prev_sibling->append_sibling($newnode);
481  }
482 
483  $node->set_attribute("id",$a_lo_id);
484  $node->set_attribute("lm",$a_lm_id);
485  }
486 
495  function appendChild ($a_node)
496  {
497  return $this->doc->append_child($a_node);
498  }
499 
507  function getRoot ()
508  {
509  return $this->doc->document_element();
510  }
511 
520  function createElement ($a_node)
521  {
522  return $this->doc->create_element($a_node);
523  }
524 
525  function addElement ($a_parent, $a_node)
526  {
527  $node = $this->doc->create_element($a_node);
528  $node = $a_parent->append_child($node);
529 
530  return $node;
531  }
532 
541  function createText ($a_text)
542  {
543  return $this->doc->create_text_node($a_text);
544  }
545 
558  function createNode ($a_parent, $a_elementname, $a_attr_list = NULL, $a_text = NULL)
559  {
560  // create new element node
561  $node = $this->createElement($a_elementname);
562 
563  // set attributes
564  if (is_array($a_attr_list)) {
565  foreach ($a_attr_list as $attr => $value) {
566  $node->set_attribute($attr, $value);
567  }
568  }
569 
570  // create and add a text node to the new element node
571  if (is_string($a_text)) {
572  $node_text = $this->doc->create_text_node($a_text);
573  $node_text = $node->append_child($node_text);
574  }
575 
576  // add element node at at the end of the children of the parent
577  $node = $a_parent->append_child($node);
578 
579  return $node;
580  }
581 
589  function getElementId($a_node)
590  {
591  $node = (array) $a_node;
592  return $node[0];
593  }
594 
602  function getElementName($a_node)
603  {
604  return $a_node->node_name();
605  }
606 
615  function setEncoding ($a_encode,$a_overwrite = false)
616  {
617  if (empty($this->doc->encoding) or ($a_overwrite)) {
618  $this->doc->encoding = $a_encode;
619  return true;
620  }
621 
622  return false;
623  }
624 
631  function getEncoding ()
632  {
633  return $this->doc->encoding;
634  }
635 
644  function setCharset ($a_charset,$a_overwrite = false)
645  {
646  if (is_integer($this->doc->charset) or ($a_overwrite)) {
647  $this->doc->charset = $a_charset;
648  return true;
649  }
650 
651  return false;
652  }
653 
660  function getCharset ()
661  {
662  return $this->doc->charset;
663  }
664 
671  function getInfo ()
672  {
673  $node = $this->getElementsByTagname("MetaData");
674 
675  if($node !== false)
676  {
677  $childs = $node[0]->child_nodes();
678 
679  foreach ($childs as $child)
680  {
681  if (($child->node_type() == XML_ELEMENT_NODE) && ($child->tagname == "General"))
682  {
683  $childs2 = $child->child_nodes();
684 
685  foreach ($childs2 as $child2)
686  {
687  if (($child2->node_type() == XML_ELEMENT_NODE) && ($child2->tagname == "Title" || $child2->tagname == "Description"))
688  {
689  $arr[$child2->tagname] = $child2->get_content();
690  }
691  }
692 
693  // General-tag was found. Stop foreach-loop
694  break;
695  }
696  }
697  }
698 
699  // for compatibility reasons:
700  $arr["title"] = $arr["Title"];
701  $arr["desc"] = $arr["Description"];
702 
703  return $arr;
704  }
705 
712  function getReferences()
713  {
714  if ($nodes = $this->getElementsByTagname("LO"))
715  {
716  foreach ($nodes as $node)
717  {
718  $attr[] = $node->get_attribute("id");
719  }
720  }
721 
722  return $attr;
723  }
724 } // END class.domxml
725 ?>