Esempio n. 1
0
 function __construct($data = '', $options = array())
 {
     $theParser = xml_parser_create();
     if (!xml_parse_into_struct($theParser, $data, $vals)) {
         $errorcode = xml_get_error_code($theParser);
         if ($errorcode != XML_ERROR_NONE && $errorcode != 27) {
             $this->_errorcode = $errorcode;
         }
     }
     //end if ! parse
     xml_parser_free($theParser);
     $flattento = '';
     $flattendat = '';
     $flattentag = '';
     $flattenattr = array();
     $subflatten = 0;
     $options['rootel'] = $options['rootel'] ? strtoupper($options['rootel']) : '';
     $options['itemel'] = $options['itemel'] ? strtolower($options['itemel']) : '';
     $options['collapsels'] = $options['collapsels'] ? $options['collapsels'] : array();
     foreach ($vals as $el) {
         if (!$options['rootel']) {
             $options['rootel'] = $el['tag'];
         }
         $isopen = $el['type'] == 'open' || $el['type'] == 'complete';
         //for readability
         $isclose = $el['type'] == 'close' || $el['type'] == 'complete';
         if ($options['rootel'] == $el['tag'] && $isclose) {
             continue;
         }
         if ($flattento) {
             //if flattening tags
             if ($isopen && $flattentag == $el['tag']) {
                 $subflatten++;
             }
             if ($isclose && $flattentag == $el['tag']) {
                 if ($subflatten) {
                     $subflatten--;
                 } else {
                     if (!in_array($flattento, $options['collapsels'])) {
                         $flattendat = '<OutlineFromXML>' . $flattendat . '</OutlineFromXML>';
                         $tmp = explode('>', $options['itemel']);
                         if ($tmp[1]) {
                             $flattendat = new OutlineFromXML($flattendat, array('rootel' => 'OutlineFromXML', 'itemel' => $tmp[1], 'collapsels' => $options['collapsels']));
                         } else {
                             $flattendat = new OutlineFromXML($flattendat, array('rootel' => 'OutlineFromXML', 'itemel' => $options['itemel'], 'collapsels' => $options['collapsels']));
                         }
                         foreach ($flattenattr as $name => $val) {
                             $flattendat->addField($name, $val);
                         }
                     }
                     //end if ! in_array
                     if (!$this->getField($flattento)) {
                         $this->addField($flattento, $flattendat);
                     } else {
                         $oldfield = $this->getField(strtolower($el['tag']));
                         if (!is_a($oldfield, 'Outline')) {
                             $oldfield = new Outline(array(array('text' => $oldfield)));
                         }
                         if (count($oldfield->getFields())) {
                             $oldfield = new Outline(array($oldfield));
                         }
                         if (!is_a($flattendat, 'Outline')) {
                             $flattendat = new Outline(array(array('text' => $flattendat)));
                         }
                         $oldfield->addNode($flattendat);
                         $this->setField(strtolower($el['tag']), $oldfield);
                     }
                     //end if-else ! getField
                     $flattendat = '';
                     $flattentag = '';
                     $subflatten = 0;
                     $flattento = '';
                     $flattenattr = array();
                     continue;
                 }
                 //end if-else subflatten
             }
             //end if isclose &&
             $emptytag = false;
             //assume not an empty tag
             if ($isopen) {
                 //if opening tag
                 $flattendat .= '<' . strtolower($el['tag']);
                 //add open tag
                 if ($el['attributes']) {
                     //if attributes
                     foreach ($el['attributes'] as $id => $val) {
                         //loop through and add
                         $flattendat .= ' ' . strtolower($id) . '="' . htmlspecialchars($val) . '"';
                     }
                     //end foreach
                 }
                 //end if attributes
                 $emptytag = $el['type'] == 'complete' && !$el['value'];
                 //is emptytag?
                 $flattendat .= $emptytag ? ' />' : '>';
                 //end tag
                 if ($el['value']) {
                     $flattendat .= htmlspecialchars($el['value']);
                 }
                 //add contents, if any
             }
             //end if isopen
             if ($el['type'] == 'cdata') {
                 //if cdata
                 $flattendat .= htmlspecialchars($el['value']);
                 //add data
             }
             //end if cdata
             if ($isclose) {
                 //if closing tag
                 if (!$emptytag) {
                     $flattendat .= '</' . strtolower($el['tag']) . '>';
                 }
                 //if not emptytag, write out end tag
             }
             //end if isclose
             continue;
         }
         //end if flattento
         if ($el['type'] == 'complete') {
             if (!in_array(strtolower($el['tag']), $options['collapsels'])) {
                 if ($el['attributes']) {
                     if ($el['value']) {
                         $el['value'] = new Outline(array('text' => $el['value']));
                     } else {
                         $el['value'] = new Outline();
                     }
                     foreach ($el['attributes'] as $id => $val) {
                         $el['value']->addField(strtolower($id), $val);
                     }
                     //end foreach attributes
                 }
                 //end if attributes
             }
             //end if ! collapsels
             if (!$this->getField(strtolower($el['tag']))) {
                 $this->addField(strtolower($el['tag']), $el['value']);
             } else {
                 $oldfield = $this->getField(strtolower($el['tag']));
                 if (!is_a($oldfield, 'Outline')) {
                     $oldfield = new Outline(array(array('text' => $oldfield)));
                 }
                 if (count($oldfield->getFields())) {
                     $oldfield = new Outline(array($oldfield));
                 }
                 if (!is_a($el['value'], 'Outline')) {
                     $el['value'] = new Outline(array('text' => $el['value']));
                 }
                 $oldfield->addNode($el['value']);
                 $this->setField(strtolower($el['tag']), $oldfield);
             }
             //end if-else getField
             continue;
         }
         //end if type == complete
         if ($el['type'] == 'cdata') {
             if ($options['rootel'] == 'OUTLINEFROMXML') {
                 $el['tag'] = 'TEXT';
             }
             if (!$this->getField(strtolower($el['tag']))) {
                 if (trim($el['value'])) {
                     $this->addField(strtolower($el['tag']), $el['value']);
                 }
             } else {
                 $this->setField(strtolower($el['tag']), $this->getField(strtolower($el['tag'])) . $el['value']);
             }
             continue;
         }
         //end if type == complete
         if ($el['type'] == 'open') {
             if ($options['rootel'] == $el['tag']) {
                 if ($options['rootel'] == 'OUTLINEFROMXML') {
                     $el['tag'] = 'TEXT';
                 }
                 if ($el['attributes']) {
                     foreach ($el['attributes'] as $id => $val) {
                         $this->addField(strtolower($id), $val);
                     }
                 }
                 //end if attributes
                 if (trim($el['value'])) {
                     $this->addField(strtolower($el['tag']), $el['value']);
                 }
                 continue;
             }
             //end if rootel
             if ($el['attributes']) {
                 foreach ($el['attributes'] as $id => $val) {
                     $flattenattr[strtolower($id)] = $val;
                 }
             }
             //end if attributes
             $flattento = strtolower($el['tag']);
             $flattentag = $el['tag'];
             $flattendat = $el['value'];
             continue;
         }
         //end if open
     }
     //end foreach vals
     $tmp = explode('>', $options['itemel']);
     if ($options['itemel'] !== false) {
         $this->nodesFromField($tmp[0]);
     }
 }