PHP DOMDocument: можно ли повторно использовать текстовый узел? - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть следующий код:

    $doc = new \DOMDocument('1.0', 'UTF-8');
    $doc->formatOutput = true;

    $element = $doc->createElement('ROOT');
    $root = $doc->appendChild($element);

    $textNode = $doc->createTextNode('I should be in both nodes');


    $element = $doc->createElement('FIRST');
    $first = $root->appendChild($element);
    $first->appendChild($textNode);

    $element = $doc->createElement('SECOND');
    $second = $root->appendChild($element);
    $second->appendChild($textNode);


    var_dump($doc->saveXML($root));

Чего я не понимаю, так это почему вывод:

<ROOT>
  <FIRST/>
  <SECOND>I should be in both nodes</SECOND>
</ROOT>

Почему элемент FIRST не содержит текста?ВТОРОЙ украл его?:) Потому что, если я удаляю часть кода, создающую ВТОРОЙ элемент, ПЕРВЫЙ получает свой текстовый узел, как и ожидалось.

1 Ответ

0 голосов
/ 13 декабря 2018

Узел может иметь только 1 родителя, поэтому, как только вы добавите его в другой узел, он останется там.

Вы можете легко клонировать узел, используя cloneNode(), но, как видно из названия, это не тот же узел, а копия.Если вы измените следующую строку на ...

$first->appendChild($textNode->cloneNode(true));

Вы получите ...

<ROOT>
  <FIRST>I should be in both nodes</FIRST>
  <SECOND>I should be in both nodes</SECOND>
</ROOT>
...