На подходе сохранения и загрузки вы также можете попробовать Document.normalizeDocument
. Это должно исправить документ, как если бы он был циклически сохранен, без фактической сериализации. Единственное, что следует сделать, - это пересчитать атрибуты isID
из типа документа, который, как вы надеетесь, будет 1008 * установлен в один из HTML типы документов (которые определяют id
как атрибут идентификатора типа значения) по loadHTML
.
(Существует также Element.setIdAttribute
, который можно использовать для объявления одного экземпляра Attr
, содержащего идентификатор, но это бесполезно для вас, так как вам придется его заполучить первый.)
Я не проверял это, хотя и не удивлюсь, если PHP не реализовал эту штуку DOM Level 3 Core должным образом. Согласно моей интерпретации спецификации для isId
, я считаю, что она должна была уже автоматически определить определение типа id
. (Моя собственная реализация DOM, безусловно, делает.) Но в этом случае ваш код работал бы. И я полагаю, что appendXML
в конце концов является нестандартным методом, поэтому нечего сказать, что он должен разрешать определения типов, такие как loadXML
или loadHTML
.
Так что, возможно, обходной путь - лучший план. Вы можете использовать DOMXPath , чтобы выбрать элемент по атрибуту @id
, а не по реальной идентичности как таковой. Конечно, это будет намного медленнее, чем getElementById
, но, надеюсь, быстрее, чем normalizeDocument
.
Или просто потерять цепочку XML-строк и, если можете, придерживаться методов DOM; тогда просто сохранить ссылку на созданный элемент. (Вы можете использовать вспомогательные функции, чтобы создавать элементы немного быстрее, если вы находите методы DOM слишком многословными для объема создаваемого контента.)