DOMDocument DOMXpath хранит атрибуты, такие как уникальные идентификаторы в php

Я хочу обнаружить различия в структурах dom и сравнить узлы. Поэтому я устанавливаю специальный атрибут объекта "uniqid" для каждого объекта DOMElement/DOMText.

Это работает:

<?php
class _1
{
    public $DOMDocument = null;
    public $DOMXpath = null;
    public function __construct()
    {
        $this->DOMDocument = new \DOMDocument();
        $this->DOMDocument->loadHTML('<div>foo</div>');
        $this->DOMXpath = new \DOMXpath($this->DOMDocument);
        $nodes = $this->DOMXpath->query('/html/body//node()');
        $nodes_id = 1;
        foreach ($nodes as $nodes__value) {
            $nodes__value->uniqid = $nodes_id;
            $nodes_id++;
        }
        var_dump(@$this->DOMXpath->query('/html/body//text()')[0]->uniqid);
    }
}

$_1 = new _1();
// 2

Сейчас я просто вынес логику в отдельные функции:

<?php
class _2
{
    public $DOMDocument = null;
    public $DOMXpath = null;
    public function __construct()
    {
        $this->DOMDocument = new \DOMDocument();
        $this->DOMDocument->loadHTML('<div>foo</div>');
        $this->DOMXpath = new \DOMXpath($this->DOMDocument);
        $this->test1();
        $this->test2();
    }
    public function test1()
    {
        $nodes = $this->DOMXpath->query('/html/body//node()');
        $nodes_id = 1;
        foreach ($nodes as $nodes__value) {
            $nodes__value->uniqid = $nodes_id;
            $nodes_id++;
        }
    }
    public function test2()
    {
        var_dump(@$this->DOMXpath->query('/html/body//text()')[0]->uniqid);
    }
}

$_2 = new _2();
// NULL
  • Может кто-нибудь объяснить, почему _1 работает, а _2 нет?
  • Как я могу безопасно «сохранить» атрибуты (не атрибуты dom) в объектах DOMDocument/DOMText для последующего доступа?

person David Vielhuber    schedule 16.12.2019    source источник
comment
Я считаю, что $this->DOMXpath->query('/html/body//text()') вернет новый экземпляр результатов с исходными ссылками на объекты (без вашего уникального идентификатора) ТАКЖЕ, потому что вы не записываете сделанные вами изменения DOM, вы в основном снова запрашиваете исходный DOM   -  person jDolba    schedule 17.12.2019
comment
Спасибо. Это не объясняет это во всех подробностях, но сейчас я делаю это с другим подходом.   -  person David Vielhuber    schedule 17.12.2019


Ответы (1)


Теперь у меня есть другой подход для получения уникального «идентификатора» для любого элемента узла:

$node->getNodePath()

Это так просто. Он работает для объектов DOMText и DOMElement.

person David Vielhuber    schedule 17.12.2019