Объединение нескольких файлов XML в один файл с другим форматом - PullRequest
1 голос
/ 20 апреля 2011

У меня 1200+ XML в том же формате, который мне нужно объединить в один XML-файл другого формата.Все отдельные файлы находятся в одном каталоге.Сервер, на котором я работаю, имеет SimpleXML, и я попытался использовать несколько различных примеров слияния, которые я нашел в Интернете (http://www.nicolaskuttler.com/post/merging-and-splitting-xml-files-with-simplexml/, для одного), но когда я просматриваю «объединенный» файл XML, только первый XMLфайл был добавлен к нему.Мне не удалось получить более одного файла для слияния с одной из нескольких моих попыток.

Формат отдельных файлов:

<?xml version="1.0" encoding="UTF-8"?>
<pr:press_release xmlns:alf="http://www.alfresco.org" xmlns:chiba="http://chiba.sourceforge.net/xforms" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:pr="http://www.bowl.com/pr" xmlns:xf="http://www.w3.org/2002/xforms" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <pr:headline>TITLE</pr:headline>
        <pr:title>TITLE</pr:title>
        <pr:contact_info xsi:nil="true"/>
        <pr:department>DEPT</pr:department>
        <pr:body>BODY</pr:body>
        <pr:launch_date>YYYY-MM-DD</pr:launch_date>
        <pr:expiration_date>YYYY-MM-DD</pr:expiration_date>
        <pr:category>CATEGORY</pr:category>
        <pr:tags>KEYWORDS</pr:tags>
</pr:press_release>

Формат, необходимый для нового файла:

<?xml version="1.0" encoding="utf-8"?>
<contents>
  <content>
    <title>TITLE</title>
    <summary></summary>
    <body>
      <root>
        <date></date>
        <author></author>
        <department></department>
        <location></location>
        <story>BODY</story>
      </root>
    </body>
  </content>
</contents>

Код, используемый для объединения двух файлов:

<?php
        $file1 = '1027coachintermediate.xml';
        $file2 = '1027coachelite.xml';
        $fileout = 'fileout.xml';       $xml1 = simplexml_load_file( $file1 );
        $xml2 = simplexml_load_file( $file2 );  // loop through the FOO and add them and their attributes to xml1
        foreach( $xml2->FOO as $foo ) {
                $new = $xml1->addChild( 'FOO' , $foo );
                foreach( $foo->attributes() as $key => $value ) {
                        $new->addAttribute( $key, $value );
                }
        }       $fh = fopen( $fileout, 'w') or die ( "can't open file $fileout" );
        fwrite( $fh, $xml1->asXML() );
        fclose( $fh );
?>

Ответы [ 2 ]

0 голосов
/ 21 апреля 2011

Не совсем уверен, где вы сделали ошибку, но ниже приведен скрипт, который должен помочь вам объединить файлы в соответствии со спецификациями:

<?php
$files = array( 'in1.xml', 'in2.xml');

$xml = new SimpleXMLElement(<<<XML
<?xml version="1.0" encoding="utf-8"?>
<contents>
</contents>
XML
);

foreach( $files as $filename) {
    $xml_int = simplexml_load_file( $filename );
    $conts = $xml_int->children('pr',true);
    $content = $xml->addChild( 'content'); // add content
    $content->addChild( 'title',$conts->title); // add first title
    // add the rest of the content insides
    // ...
}
var_export($xml->asXML());
?>

выход

<?xml version="1.0" encoding="utf-8"?>            
<contents><content><title>TITLE1</title></content><content><title>TITLE2</title></content></contents>

см. http://pl.php.net/manual/en/simplexml.examples-basic.php для получения дополнительной информации

Другой вопрос, если вы действительно хотите сохранить весь XML в памяти. Вы можете просто добавить $content->asXML() один за другим в файл.

0 голосов
/ 21 апреля 2011

Если это одноразовая задача, вы можете объединить все файлы вместе, а затем запустить простой процесс XSLT для объединенного файла.

1) Сценарий оболочки для объединения файлов

for file in `ls $XMLDIR`
  do
        cat $file | grep -v "xml version" >> big_concat_file.xml
  done

2) Отредактируйте файл concat вручную, добавив корневой тег-обертку.

<document>
   <pr:press-release>
       ....
   </pr:press-release>
   <pr:press-release>
       ...
   </pr:press-release>
</document>

3) Запустите файл XSLT для объединенного файла

...