Помогите с изменением XML файла

127
21 декабря 2020, 10:40

Есть файл xml на пример с такой структурой:

<markers>
   <marker>
      <type></type>
      <title></title>
      <address></address>
      <latitude></latitude>
      <longitude></longitude>
   </marker>
   <marker>
      <type></type>
      <title></title>
      <address></address>
      <latitude></latitude>
      <longitude></longitude>
   </marker>
</markers>

Необходимо программно в php изменить структуру файла xml. Либо может быть кто то знает софт для данных целей, тогда подскажите софтину.

Конечный файл должен выглядеть примерно вот так:

    <auto>
       <model>
          <type></type>
          <title></title>
       </model>
       <model>
          <type></type>
          <title></title>
       </model>
    </auto>

Файлы большие. Изменять нужно много. Хочу хотя бы понять по какому принципу либо в чем это делается.

Answer 1

Как я уже написал в комментарии для преобразований XML документа существует XSLT. В пхп поддерживается на уровне модуля php_xsl.so.

В общем случае загружаете 2 документа (исходный и стили) создаете экземпляр XSLTProcessor и применяете одно к другому.

$xml = new DOMDocument();
$xml->load('input.xml');    
$xsl = new DOMDocument();
$xsl->load('transform.xsl');   
$proc = new XSLTProcessor();  
$proc->importStyleSheet($xsl);    
echo $proc->transformToXML($xml);

О самом XSLT я имею весьма поверхностные представления, но например такая таблица стилей

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="markers">
    <auto>
      <xsl:for-each select="marker">
         <model>
           <type><xsl:value-of select="type"/></type>     
         </model>  
      </xsl:for-each>
    </auto>
  </xsl:template>
</xsl:stylesheet>

сформирует вам желаемый документ. В целом там используются выражения XPath и т.п. Так что почитайте литературу и используйте эти средства. Либо решайте задачу влоб, читая один документ, и формируя на его основе второй.

Если файлы большие прям вообще большие (сотни мегабайт, гигабайты) то решения на основе DOM вам вообще не пойдут, потому что все это будет съедать всю память и падать. В таком случае следует использовать SAX-парсеры и т.п. Либо искать решения, способные потоково читать документ и применять XSL трансформации.

Answer 2

Можешь использовать SimpleXML. Для ознакомления два сайта: https://www.php.net/manual/ru/book.simplexml.php
https://shra.ru/2018/06/perevodim-massiv-v-xml-na-php/

READ ALSO
не отправляется POST запрос через CURL

не отправляется POST запрос через CURL

есть код , но при отправке , сервер не получае мой запрос ввиде json,прилетает пустой , в чем может быть проблема

110
Как отправить изображение base64 через WordPress contact form 7?

Как отправить изображение base64 через WordPress contact form 7?

Возникла проблемаУ меня есть канвас и картинка, которая в нем генерируется

113
Как выгружать файлы из сервера в Unity

Как выгружать файлы из сервера в Unity

Делаю таблицу лидеровЗагружаю данные пользователя при регистрации через WWWForm и WWW

100