PHP XML находит узел «поиск» и создает новый узел после «узла поиска».

#php #xml

Вопрос:

мне нужна твоя помощь :

загрузка XML из файла. Я также загружаю данные из CSV-файла. У меня есть 2 столбца в CSv:

  1. ID
  2. Номер

Я ищу идентификатор из CSV в XML — файле.

Я могу найти тебя, все работает. Однако мне нужно отредактировать XML следующим образом:

  1. Если вы найдете элемент в 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');

?>
 

Данные CSV :
введите описание изображения здесь

Кто-нибудь может мне помочь, пожалуйста ?

Ответ №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»