PHP сборка XML-файлов с использованием DOMDocument в пакетном режиме - PullRequest
1 голос
/ 30 ноября 2011

У меня проблема при циклическом просмотре данных и создании файлов XML с использованием DOMDocument. Все работало нормально, пока я не решил запустить этот скрипт партиями. Теперь у меня есть несколько '<?xml version="1.0"?>' начальных тегов в моих XML-файлах, похоже, по одному для каждого пакета. Также генерируется больше узлов товаров, чем товаров. Может ли кто-нибудь помочь.

//get products          
$productsObj = new Products($db,$shopKeeperID);
                //find out how many products        
$countProds = $productsObj->countProducts();        

$productBatchLimit = 3; //keep low for testing

//create new file       
$file = 'products/'. $products . '.xml';                    
$fh = fopen($file, 'a');    

//create XML document object model (DOM)        
$doc = new DOMDocument();


$doc->formatOutput = true;      
$counter = 1;       
$r = $doc->createElement( "products" );         
$doc->appendChild( $r );

for ($i = 0; $i < $countProds; $i += $productBatchLimit) {              

$limit = $productBatchLimit*$counter;

$products = $productsObj->getShopKeeperProducts($i, $limit);    

$prod = ''; 

//loop through each product to create well formed XML           
foreach( $products as $product ){           

$prod = $doc->createElement( "offer" );

$offerID = $doc->createElement( "offerID" );
$offerID->appendChild($doc->createTextNode( $product['prod_id'] ));
$prod->appendChild( $offerID );     
$productName = $doc->createElement( "name" ); 
$productName->appendChild($doc->createTextNode( $product['productName'] ));
$prod->appendChild( $productName );     

$r->appendChild( $prod );
$strxml = $doc->saveXML();  
}           
fwrite($fh, $strxml);       
$counter++;         
}       
 fclose($fh);

Ответы [ 3 ]

1 голос
/ 30 ноября 2011

Я использую эту команду, которая стирает все строки, например <?something?>.

            $text = preg_replace( '/<\?[^\?>]*\?>/', ' ', $text);

Сначала удалите их все, а затем поставьте одну в начале.

1 голос
/ 30 ноября 2011

Я только что сделал это некоторое время назад, я не могу точно понять, что происходит не так.Но я могу предоставить вам функцию, которую я создал для сайта.
Эта функция работала на 100% нормально и, как и ожидалось.Он создал идеальный документ XML и отлично отформатировал его.Я надеюсь, что это поможет вам найти вашу проблему.

function create_xml_file()
{
/* create a dom document with encoding utf8 */
$domtree = new DOMDocument('1.0', 'utf-8');

/* create the root element of the xml tree */
/* Data Node */
$xmlRoot = $domtree->createElement("data");

/* append it to the document created */
$xmlRoot = $domtree->appendChild($xmlRoot);

/* Set our Prices in our <data> <config> node */
$config_node = $domtree->createElement("config");
$config_node = $xmlRoot->appendChild($config_node);

// Add - node to config
$config_node->appendChild($domtree->createElement('config_node', '123456'));
$config_node->appendChild($domtree->createElement('some_other_data', '123456'));

/* Create prices Node */
$price_node = $domtree->createElement('price');
$price_node = $config_node->appendChild($price_node);

/* Black Price Node */
$black_node = $price_node->appendChild($domtree->createElement('black'));
foreach ($p->List_all() as $item):
    if ($item['color'] == 'black'):
        $black_node->appendChild($domtree->createElement($item['type'], $item['price']));
    endif;
endforeach;

/* Create galleries Node */
$galleries_node = $domtree->createElement("galleries");
$galleries_node = $xmlRoot->appendChild($galleries_node);
foreach ($i->List_all() as $image):
    /* Our Individual Gallery Node */
    $gallery_node = $domtree->createElement("gallery");
    $gallery_node = $galleries_node->appendChild($gallery_node);

    $gallery_node->appendChild($domtree->createElement('name', $image['name']));
    $gallery_node->appendChild($domtree->createElement('filepath', $image['filepath']));
    $gallery_node->appendChild($domtree->createElement('thumb', $image['thumb']));
endforeach;

/* Format it so it is human readable */
$domtree->preserveWhiteSpace = false;
$domtree->formatOutput = true;

/* get the xml printed */
//echo $domtree->saveXML();
$file = 'xml/config.xml';
$domtree->save($file);
}

Я надеюсь, что это поможет вам найти ваш ответ.Я прокомментировал это хорошо для легкого понимания.

0 голосов
/ 01 декабря 2011

Я просто изменил

$strxml = $doc->saveXML(); 

и

fwrite($fh, $strxml);  

К

$doc->save($file);

и работает отлично.

...