DOMDocument позволяет вам копировать структуры узлов, поэтому вместо того, чтобы копировать все детали по отдельности (что может привести к отсутствию данных при изменении спецификации), вы можете скопировать весь узел (например,как <Inmueble>
) из одного документа в другой, используя importNode()
, у которого есть параметр, указывающий, что необходимо скопировать все содержимое элемента.Этот подход также позволяет вам копировать любую из таблиц, используя одну и ту же функцию, без изменения кода ...
function extractData ( $sourceFile, $table ) {
// Load source data
$source = new DOMDocument();
$source->load($sourceFile);
$xp = new DOMXPath($source);
// Create new data document
$newFile = new DOMDocument();
$newFile->formatOutput = true;
// Create base element with the table name in new document
$newRoot = $newFile->createElement($table);
$newFile->appendChild($newRoot);
// Find the records to copy
$records = $xp->query('//Table[@Name="'.$table.'"]/*');
foreach ( $records as $record ) {
// Import the node to copy and append it to new document
$newRoot->appendChild();
}
// Return the source of the XML
return $newFile->saveXML();
}
echo extractData ($xml_external_path, "Inmuebles");
Вы можете изменить метод так, чтобы он возвращал документ как DOMDocument или даже версию SimpleXML, если вы хотитеобработайте его далее.
Для SimpleXML измените возвращаемое значение на ...
return simplexml_import_dom($newRoot);
, а затем вы можете назвать его как ...
$ret = extractData ($xml_external_path, "Inmuebles");
echo $ret->asXML();
Или есливам просто нужен фиксированный способ сделать это, вы можете удалить XPath и просто использовать getElementsByTagName()
, чтобы найти узлы для копирования ...
$source = new DOMDocument();
$source->load($xml_external_path);
$newFile = new DOMDocument();
$newRoot = $newFile->createElement("Inmuebles");
$newFile->appendChild($newRoot);
// Find the records to copy
foreach ( $source->getElementsByTagName("Inmueble") as $record ) {
$newRoot->appendChild($newFile->importNode($record, true));
}
echo $newFile->saveXML();
Чтобы добавить имя файла сохранения, я добавилновый параметр функции, эта новая функция вообще ничего не возвращает - она просто загружает файл и сохраняет результат в новом имени файла ...
function extractData ( $sourceFile, $table, $newFileName ) {
// Load source data
$source = new DOMDocument();
$source->load($sourceFile);
$xp = new DOMXPath($source);
// Create new file document
$newFile = new DOMDocument();
$newFile->formatOutput = true;
// Create base element with the table name in new document
$newRoot = $newFile->createElement($table);
$newFile->appendChild($newRoot);
// Find the records to copy
$records = $xp->query('//Table[@Name="'.$table.'"]/*');
foreach ( $records as $record ) {
// Import the node to copy and append it to new document
$importNode = $newFile->importNode($record, true);
// Add new content
$importNode->appendChild($newFile->createElement("Title", "value"));
$newRoot->appendChild();
}
// Update Foto elements
$xp = new DOMXPath($newFile);
$fotos = $xp->query("//*[starts-with(local-name(), 'Foto')]");
foreach ( $fotos as $foto ) {
$path = $foto->nodeValue;
if( substr($path, 0, 5) == "/www/" ) {
$path = substr($path,4);
}
// Replace node with new version
$foto->parentNode->replaceChild($newFile->createElement("Foto1", $path),
$foto);
}
$newFile->save($newFileName);
}
$xml_external_path = 'http://www.csainmobiliaria.com/imagenes/fotos/pisos.xml';
$xml_external_savepath = 'saveFile.xml';
extractData ($xml_external_path, "Inmuebles", $xml_external_savepath);