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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Соединить множество XML файлов в один

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
ybiza
Отправлено: 02 Июля, 2014 - 20:12:52
Post Id


Новичок


Покинул форум
Сообщений всего: 30
Дата рег-ции: Июль 2010  


Помог: 0 раз(а)




Здравствуйте! Дело в следующем. У меня в проекте имеются множество 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 в один без массива с учетом моей структуры.
 
 Top
ybiza
Отправлено: 03 Июля, 2014 - 15:09:18
Post Id


Новичок


Покинул форум
Сообщений всего: 30
Дата рег-ции: Июль 2010  


Помог: 0 раз(а)




Решил пойти другим путем и создать Массив самостоятельно, а не через 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.  

То есть в массив не может поместить значения второй группы. Как можно исправить. Есди не трудно пример кода.
 
 Top
armancho7777777 Супермодератор
Отправлено: 03 Июля, 2014 - 15:34:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




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>');

(Отредактировано автором: 03 Июля, 2014 - 16:16:04)

 
 Top
caballero
Отправлено: 03 Июля, 2014 - 16:26:28
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




XML - это текстовые файлы. Обрезаем <root> с обоих сторон и склеиваем как строки.
все дела


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
ybiza
Отправлено: 03 Июля, 2014 - 18:24:03
Post Id


Новичок


Покинул форум
Сообщений всего: 30
Дата рег-ции: Июль 2010  


Помог: 0 раз(а)




Всем спасибо кто откликнулся! Решил свою проблему.
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.  

Есть небольшая просьба, если кто-то знает как можно улучшить процесс, можете отписать, буду благодарен.

(Отредактировано автором: 03 Июля, 2014 - 18:36:15)

 
 Top
Victo
Отправлено: 06 Октября, 2016 - 15:40:16
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Окт. 2016  


Помог: 0 раз(а)




Люди добрые помогите склеить несколько файлов xml в один. В программировании вообще ничего не понимаю. Могу сбросить файлы тому кто умеет "склеивать". Отблагодарю!
 
 Top
ybiza
Отправлено: 08 Октября, 2016 - 07:22:11
Post Id


Новичок


Покинул форум
Сообщений всего: 30
Дата рег-ции: Июль 2010  


Помог: 0 раз(а)




Вам необходимо создать новый файл из нескольких файлов
 
 Top
Victo
Отправлено: 08 Октября, 2016 - 09:21:18
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Окт. 2016  


Помог: 0 раз(а)




Спасибо. Уже не актуально - разобрался сам.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« XML и его обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB