PHP SimpleXML: вставьте узел в определенном положении

скажите, что у меня есть XML:

<root>
  <nodeA />
  <nodeA />
  <nodeA />
  <nodeC />
  <nodeC />
  <nodeC />
</root>

Как я вставляю "nodeB" между As и Cs? В PHP, предпочтительно через SimpleXML? Как:

<root>
  <nodeA />
  <nodeA />
  <nodeA />
  <nodeB />
  <nodeC />
  <nodeC />
  <nodeC />
</root>
10
задан hakre 27 April 2013 в 07:31
поделиться

1 ответ

Ниже приводится функция для вставки нового SimpleXMLElement после некоторого другого SimpleXMLElement. Поскольку это невозможно напрямую с SimpleXML, он использует некоторые классы / методы DOM за кулисами для выполнения работы.

function simplexml_insert_after(SimpleXMLElement $insert, SimpleXMLElement $target)
{
    $target_dom = dom_import_simplexml($target);
    $insert_dom = $target_dom->ownerDocument->importNode(dom_import_simplexml($insert), true);
    if ($target_dom->nextSibling) {
        return $target_dom->parentNode->insertBefore($insert_dom, $target_dom->nextSibling);
    } else {
        return $target_dom->parentNode->appendChild($insert_dom);
    }
}

И пример того, как это можно использовать (конкретно для вашего вопроса):

$sxe = new SimpleXMLElement('<root><nodeA/><nodeA/><nodeA/><nodeC/><nodeC/><nodeC/></root>');
// New element to be inserted
$insert = new SimpleXMLElement("<nodeB/>");
// Get the last nodeA element
$target = current($sxe->xpath('//nodeA[last()]'));
// Insert the new element after the last nodeA
simplexml_insert_after($insert, $target);
// Peek at the new XML
echo $sxe->asXML();

Если вы хотите / нуждаетесь в объяснении того, как это работает (код довольно простой, но может включать иностранные концепции ), Просто спроси.

16
ответ дан 3 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: