Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Соединить множество XML файлов в один
Форумы портала PHP.SU » » XML и его обработка » Соединить множество XML файлов в один

Страниц (1): [1]
 

1. ybiza - 02 Июля, 2014 - 20:12:52 - перейти к сообщению
Здравствуйте! Дело в следующем. У меня в проекте имеются множество XML файлов с одинаковыми именами (настройки для каждого переложения, языковые пакеты). Формат файла следующий:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <root>
  4.   <Name1>
  5.     <Name></Name>
  6.     <Setting></Setting>
  7.   </Name1>
  8. <root>
  9.  

Я ищу по каталогу в папках сайта пути к файлам XML, после чего через SimpleXML в цикле соединяю их в один рекурсивный массив.

После чего я пытаюсь создать из массива XML единый документ, но вот на этом этапе у меня сложности.
Я использую следующую функцию:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.                 public function convertXML ($data)
  3.                         {
  4.                                 $this->writer->openMemory();
  5.                                 $this->writer->setIndent ('on');
  6.                                 $this->writer->startDocument($this->version, $this->encoding);
  7.                                 $this->writer->startElement($this->rootName);
  8.                                         $this->getXML($data);
  9.                                 $this->writer->endElement();
  10.                                 return $this->writer->outputMemory();
  11.                         }
  12.  
  13.                 private function getXML ($data)
  14.                         {
  15.                                 foreach ($data as $key => $val)
  16.                                         {
  17.  
  18.                                                 if (is_numeric($key))
  19.                                                         {
  20.                                                                 $key = 'item'. $key;
  21.                                                         }
  22.                                                 if (is_object($val))
  23.                                                         {      
  24.                                                                 foreach ($val as $oject => $value)                     
  25.                                                                         {
  26.                                                                                 $this->writer->writeElement($oject, $value);
  27.                                                                         }
  28.                                                         }
  29.                                                 if (is_array ($val))
  30.                                                         {
  31.                                                                 $this->writer->writeElement($key, $val);
  32.                                                                 $this->getXML($val);
  33.                                                                 $this->writer->endElement();
  34.                                                         }
  35.                                                 else
  36.                                                         {
  37.                                                                 $this->writer->writeElement($key, $val);
  38.                                                         }
  39.                                         }
  40.                         }
  41.  

Результат выполнения сохраняется в файл в последующем, но в нем имеются пустые строки. Что здесь может быть не понимаю. Уже третий день бьюсь, а победить не удается. Если этот путь ошибочный, то может кто-нибудь предоставить другое решение задачи "Преобразовать XML данные в массив, соединить массивы, а массив преобразовать в XML, либо соединить все XML в один без массива с учетом моей структуры.
2. ybiza - 03 Июля, 2014 - 15:09:18 - перейти к сообщению
Решил пойти другим путем и создать Массив самостоятельно, а не через SimpleXml, так как тот создает объект, что немного отличает его от моей типографии.
Но встала опять проблема:
XML:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?xml version="1.0"?>
  3. <root>
  4.         <File2>
  5.                 <Name>File2Site</Name>
  6.                 <Path>/library/ally/File2Site.class.php</Path>
  7.                 <Prefix>F2S_</Prefix>
  8.         </File2>
  9.         <File3>
  10.                 <Name>File2Site</Name>
  11.                 <Path>/library/ally/File2Site.class.php</Path>
  12.                 <Prefix>F2S_</Prefix>
  13.         </File3>
  14. </root>
  15.  

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.      $this->xml = new XMLReader();
  3.  
  4.      function parse($contents) {
  5.         $this->xml->open($contents);      
  6.         $this->xml->next();
  7.         $current = &$array[$this->xml->localName];
  8.         $stack[0]= &$current;
  9.         while($this->xml->read()){
  10.           if($this->xml->nodeType == XMLReader::ELEMENT){
  11.           $current = &$stack [$this->xml->depth-1];
  12.           $stack [$this->xml->depth] = &$current[$this->xml->localName];
  13.           $current = &$stack[sizeof($stack)-1];
  14.          }
  15.         }
  16.         return $array;
  17.     }
  18.  

Выдает:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. (
  3.     [root] => Array
  4.         (
  5.             [File2] => Array
  6.                 (
  7.                     [Name] =>
  8.                     [Path] =>
  9.                     [Prefix] =>
  10.                 )
  11.  
  12.             [File3] => Array
  13.                 (
  14.                     [Name] =>
  15.                     [Path] =>
  16.                     [Prefix] =>
  17.                 )
  18.  
  19.         )
  20.  
  21. )
  22.  

То есть в массив не может поместить значения второй группы. Как можно исправить. Есди не трудно пример кода.
3. armancho7777777 - 03 Июля, 2014 - 15:34:36 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $xmlFiles = array('file1.xml', 'file2.xml', 'file3.xml');
  2. $xmlString = '<\?xml version="1.0"?><root>';
  3. $dom = new DOMDocument();
  4. $dom->formatOutput = true;
  5.  
  6. foreach($xmlFiles as $i => $xmlFile)
  7. {
  8.     $dom->loadXML(file_get_contents($xmlFile));
  9.  
  10.     $xmlString .= '<file' . ($i + 1) . '>';
  11.  
  12.     foreach($dom->documentElement->childNodes as $child) {
  13.         $xmlString .= $dom->saveXML($child);
  14.     }
  15.  
  16.     $xmlString .= '</file' . ($i + 1) . '>';
  17. }
  18.  
  19. file_put_contents('new_file.xml', $xmlString . '</root>');
4. caballero - 03 Июля, 2014 - 16:26:28 - перейти к сообщению
XML - это текстовые файлы. Обрезаем <root> с обоих сторон и склеиваем как строки.
все дела
5. ybiza - 03 Июля, 2014 - 18:24:03 - перейти к сообщению
Всем спасибо кто откликнулся! Решил свою проблему.
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. class XMLFile
  3. {
  4.  
  5.  public  $fullArray = array ();
  6.  private $writer;
  7.  private $version =  '1.0';
  8.  private $encoding = 'UTF-8';
  9.  private $rootName = 'root';
  10.  private $saveRoot = 'SettingArray.xml';
  11.  
  12.  public function XmlToArray ($element, $arr = array())
  13.   {
  14.    if (is_string ($element))
  15.         {
  16.                 $element = (strlen ($element) > 5 && substr ($element, -4) === '.xml')
  17.                                         ? simplexml_load_file (__DIR__. "/". $element)
  18.                                         : simplexml_load_string ($element);
  19.         }
  20.    foreach ($element->children () as $base)
  21.         {
  22.                 $sub = $base->getName ();
  23.                 if (!$base->children ())
  24.                         {
  25.                                 $arr[$sub] = trim ($base [0]);
  26.                         }
  27.                 else
  28.                         {
  29.                                 $arr[$sub]= array();
  30.                                 $arr[$sub] = $this->XmlToArray ($base, $arr [$sub]);
  31.                         }
  32.                                            
  33.                                         }
  34.                                 return $arr;
  35.                         }
  36.  
  37.   public function convertXML ($data)
  38.    {
  39.         $this->writer = new XMLWriter();
  40.         $this->writer->openMemory();
  41.         $this->writer->setIndent ('on');
  42.         $this->writer->startDocument($this->version, $this->encoding);
  43.         $this->writer->startElement($this->rootName);
  44.         if (is_array($data))
  45.                 {
  46.                         $this->getXML($data);
  47.                 }
  48.         $this->writer->endElement();
  49.         return $this->writer->outputMemory();
  50.   }
  51.  
  52.   private function getXML ($data)
  53.   {
  54.         foreach ($data as $key => $val)
  55.                 {
  56.                         if (is_numeric($key))
  57.                                 {
  58.                                         $key = 'item'. $key;
  59.                                 }
  60.                                 if (is_array ($val))
  61.                                         {
  62.                                                 $this->writer->startElement($key);
  63.                                                 $this->getXML($val);
  64.                                                 $this->writer->endElement();
  65.                                         }
  66.                                 else
  67.                                         {
  68.                                                                 $this->writer->writeElement($key, $val);
  69.                                         }
  70.                 }
  71.    }
  72.  
  73.         public function saveArray ($element = array ())
  74.                         {
  75.                                 foreach ($element as $base)
  76.                                         {
  77.                                                 $this->fullArray = array_merge_recursive ((array) $this->fullArray, (array) $this->XmlToArray ($base));
  78.                                         }
  79.                                 return $this->fullArray;
  80.                         }
  81.  
  82.         public function saveXML ($element)
  83.                         {
  84.                                 $xml = file_put_contents ($this->saveRoot, $element);
  85.                                 return $xml;
  86.                         }
  87.         }
  88.  


Вот класс.
Пример xml:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.  <File3>
  3.   <Name>1</Name>
  4.   <Path>2</Path>
  5.   <Prefix>3</Prefix>
  6.  </File3>
  7.  

Класс разбирает xml такого формата, может быть разбирает еще что нибудь но я не ставил эксперименты.
Пример использования:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $xml =  new XMLFile; // Запускаем класс для работы
  3. $arrayFile = array ("SettingsXML.xml", "library/SettingsXML.xml", "library/ally/SettingsXML.xml");
  4. $xml->saveArray ($arrayFile); // разберем xml который находятся в несколько файлов в один массив, используя рекурсию
  5. $xml->fullArray ['File3']['Name'] = "Привет"; // Редактирование массива
  6. $xml->saveXML ($xml->convertXML ($xml->fullArray)); преобразовываем массив в xml и сохраним xml в заранее определенное место.
  7. // Также
  8. $xml->XmlToArray () // Может разобрать один файл или отдельную строку в массив
  9.  

Есть небольшая просьба, если кто-то знает как можно улучшить процесс, можете отписать, буду благодарен.
6. Victo - 06 Октября, 2016 - 15:40:16 - перейти к сообщению
Люди добрые помогите склеить несколько файлов xml в один. В программировании вообще ничего не понимаю. Могу сбросить файлы тому кто умеет "склеивать". Отблагодарю!
7. ybiza - 08 Октября, 2016 - 07:22:11 - перейти к сообщению
Вам необходимо создать новый файл из нескольких файлов
8. Victo - 08 Октября, 2016 - 09:21:18 - перейти к сообщению
Спасибо. Уже не актуально - разобрался сам.

 

Powered by ExBB FM 1.0 RC1