2015-10-13 2 views
1

Мне нужно сгенерировать файл XML. Для генерации я создал следующий класс.Неполный файл XML, созданный

class MXML extends DOMDocument { 

    private $version,$encodingType,$rootNode,$videoParam,$encodingFormat,$audioParam; 

    /** 
    * Initilizes the DOM with version number and encoding 
    * @param $version 
    * @param $encoding 
    */ 
    public function __construct($version,$encoding) { 
     parent::__construct($version,$encoding); 
     $this->formatOutput = true; // Nicely formats output with indentation and extra space. 
    } 

    /** 
    * Sets the root tag for XML 
    * @param unknown $node 
    */ 
    public function setRoot($node) { 
     $this->rootNode = $this->createElement($node); 
     $this->appendChild($this->rootNode); 

    } 

    /** 
    * Sets the video param node. 
    * @param unknown $videoParamNode 
    */ 
    public function setVideoParamNode($videoParamNode) { 
     $this->videoParam = $this->createElement($videoParamNode); 
     $this->rootNode->appendChild($this->videoParam); 
    } 

    /** 
    * Sets the audio param node 
    * @param unknown $audioParamNode 
    */ 
    public function createAudioParamNode($audioParamNode) { 
     $this->audioParam = $this->createElement($audioParamNode); 
     $this->rootNode = $this->appendChild($this->audioParam); 
    } 

    /** 
    * Set Encoding Format. Example : MPEG4,H264 
    * @param unknown $eformat 
    */ 
    public function setEncodingFormat($eformat) { 
     $this->encodingFormat = $this->createElement($eformat); 
     $this->videoParam->appendChild($this->encodingFormat); 
    } 

    /** 
    * It creates a container in DOM with Parent Node at the top and children containg respective values. 
    * 
    * <Parameter> 
    *  <IQuant>2</IQuant> 
    *  <PQuant>2</PQuant> 
    *  <FramesToSkip>0</FramesToSkip> 
    *  <PBetweenI>50</PBetweenI> 
    *  <FrameRate>24.00</FrameRate> 
    *  <SearchWindow>31</SearchWindow> 
    * </Parameter> 
    *  
    * @param array $containerArray 
    * $containerArray = array(
    *  'Parent' => 'Parameter' 
    *  'Children' => array(
    *      'IQuant'   => 2 
    *      'PQuant'   => 3   
    *      'FramesToSkip'  => 0 
    *      'FrameRate'   => 21.00 
    *     ) 
    *); 
    */ 
    public function createContainer($containerArray) { 
     $parentNode = $containerArray['Parent']; 
     $childrenList = $containerArray['Children']; 
     $parentNode = $this->createElement($parentNode); 
     $this->encodingFormat->appendChild($parentNode); 

     foreach ($childrenList as $n => $v) { 
      $n = $this->createElement($n); 
      $n->appendChild($this->createTextNode($v));      
     }   
    } 

    /** 
    * Returns the XML, or FALSE if an error occurred. 
    * @return Returns the XML (as string), or FALSE if an error occurred. 
    */ 
    public function getXML() { 
     return $this->saveXML(); 
    } 
}; 

Класс имеет метод createContainer, который принимает массив с именем Parent узла и детей в виде ассоциативного массива.

Вызовы выполняются следующим образом:

$xml = new MXML('1.0', "iso-8859-1"); 

    $xml->setRoot("Cutkompress-Parameters"); 
    $xml->setVideoParamNode("Video-Params"); 
    $xml->setEncodingFormat("EncodingFormat-MPEG-4Part2"); 
    $xml->createContainer($this->getParameterArray()); 
    $xstring = $xml->getXML(); 

Призывы идти без сбоя, но XML генерируется не в порядке. Он выглядит следующим образом:

<?xml version="1.0" encoding="iso-8859-1"?> <Cutkompress-Parameters> <Video-Params> 
<EncodingFormat-MPEG-4Part2> <Parameter/> </EncodingFormat- 
MPEG-4Part2> </Video-Params> </Cutkompress-Parameters> 

Другие теги хорошо, но Parameter тег создан из createContainer создает неполную XML без параметров.

Что может быть причиной этого?

ответ

1

Вы не добавляете дочерние элементы в родительский узел, а только родительский код для кодировки и текст для детей. Добавить $parentNode->appendChild($n), пока вы повторяете свои $childrenList.

Смежные вопросы