#php #xml
Вопрос:
мне нужна твоя помощь :
загрузка XML из файла. Я также загружаю данные из CSV-файла. У меня есть 2 столбца в CSv:
- ID
- Номер
Я ищу идентификатор из CSV в XML — файле.
Я могу найти тебя, все работает. Однако мне нужно отредактировать XML следующим образом:
- Если вы найдете элемент в XML, идентификатор которого содержит значение идентификатора из файла CSV, скопируйте этот элемент столько раз, сколько значение в CSV (номер столбца).
Вот мой код.
<?php
$file = 'doc.xml';
if (!copy($file, $newfile)) {
echo "failed to copy";
}
$fh = fopen("data.csv", "r");
$csvData = array();
//Loop through the rows in our CSV file and add them to
//the PHP array that we created above.
while (($row = fgetcsv($fh, 0, ";")) !== FALSE) {
$csvData[] = $row;
}
$length = count($csvData);
if (file_exists('doc.xml')) {
$xml = simplexml_load_file('doc.xml');
for ($i=0; $i < $length; $i ) {
$searchedNode = $csvData[$i 1][0];
$searchingMedia = $xml->xpath("/node/media/image[contains(@id,'$searchedNode')]");
foreach ($searchingMedia as $node) {
$update = $node->addAttribute('count',$csvData[$i 1][1]);
}
}
}
$xml->asXml('doc_new.xml');
?>
Кто-нибудь может мне помочь, пожалуйста ?
Ответ №1:
SimplXML абстрагирует XML — узлы, поэтому это не лучший API для прямых манипуляций с узлами-используйте DOM.
Вы не привели пример, но из вашего кода я ожидал бы чего-то подобного:
$data = [
[
'42', '6'
]
];
$xml = <<<'XML'
<root>
<node>
<media>
<image id="42"/>
</media>
</node>
</root>
XML;
Тогда это довольно просто:
// bootstrap the DOM
$document = new DOMDocument();
// let the parser ignore whitespace nodes (indents)
$document->preserveWhiteSpace = FALSE;
$document->loadXML($xml);
// DOM has a spearate object for Xpath
$xpath = new DOMXpath($document);
// iterate the CSV data
foreach ($data as $row) {
// looking for "image" elements with a specific id attribute
$expression = sprintf(
'//root/node/media/image[@id="%s"]',
$row[0]
);
// iterate the found image nodes
foreach ($xpath->evaluate($expression) as $imageNode) {
// "amount" times
for ($i = 0, $c = (int)$row[1]; $i < $c; $i ) {
// clone the "image" element and insert clone after it
$imageNode->after(
$newNode = $imageNode->cloneNode(TRUE)
);
// modify the clone
$newNode->textContent = 'Inserted Node #'.$i;
}
}
}
$document->formatOutput = TRUE;
echo $document->saveXML();
Выход:
<?xml version="1.0"?>
<root>
<node>
<media>
<image id="42"/>
<image id="42">Inserted Node #5</image>
<image id="42">Inserted Node #4</image>
<image id="42">Inserted Node #3</image>
<image id="42">Inserted Node #2</image>
<image id="42">Inserted Node #1</image>
<image id="42">Inserted Node #0</image>
</media>
</node>
</root>
Комментарии:
1. большое спасибо @ThW … «danke sehr»