Почему getElementById не работает в этом случае?

У меня есть часть кода PHP.

PHP:

$Implementation = new DOMImplementation(); $Document = $Implementation->createDocument( NULL, NULL, $Implementation->createDocumentType( 'html' ) ); $Document->encoding = 'utf-8'; $Document->loadXML( $main_html[ 'main' ] ); // load main.html $Document->xinclude(); $Fragment = $Document->createDocumentFragment(); $Fragment->appendXML( $main_html[ 'page' ] ); // load page.html $Document->getElementById( 'content' )->appendChild( $Fragment ); ... 

Все работает хорошо, кроме последней строки, появляется ошибка:

 PHP Fatal error: Call to a member function appendChild() on a non-object 

Кажется, метод getElementById() не работает для $Document .

Посмотрите на HTML.

HTML (main.html):

 ... </head> <body xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include href="wrapper.html" /> </body> </html> 

HTML (wrapper.html):

 <section id="wrapper" xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include href="header.html" /> <xi:include href="nav.html" /> <xi:include href="content.html" /> <xi:include href="aside.html" /> <xi:include href="footer.html" /> </section> 

HTML (content.html):

 <section id="content" /> 

Я добавил $Document->validateOnParse = TRUE; перед $Document->loadXML( $main_html[ 'main' ] ); и протестирован без XInclude, но не работает.

Наконец, я нашел решение, плохую замену строки:

 $Document->getElementsByTagName( 'section' )->item( 1 )->appendChild( $Fragment ); 

Метод getElementsByTagName() работает для $Document но не удовлетворяет меня. Я что-то пропустил?

Вы должны передать DTD, который определяет атрибут id . В противном случае вы не сможете использовать getElementById .

Для получения дополнительной информации см.

У меня была та же проблема и получил тот же ответ, о котором говорилось выше. Поскольку я не знаю, как определить DTD, я получил следующее решение:

Измените код HTML:

 <section id="content" /> 

в

 <section xml:id="content" /> 

Если вам по-прежнему нужен атрибут id (для целей Javascript), вы можете использовать следующий код:

 <section id="content" xml:id="content" /> 

Я столкнулся с другой проблемой с этим решением, поскольку атрибут xml: id не пройдет проверку. Мое решение для этой проблемы было следующим: Оставьте код HTML как есть:

 <section id="content" /> 

Теперь измените свой PHP-код следующим образом:

 /* ... Add xml:id tags */ $tags = $Document -> getElementsByTagName('*'); foreach ($tags as $tag) $tag->setAttribute('xml:id',$tag->getAttribute('id')); /* ... Here comes your PHP code */ $Document->getElementById( 'content' )->appendChild( $Fragment ); /* ... Remove xml:id tags */ foreach ($tags as $tag) $tag->removeAttribute('xml:id'); 

Это решение идеально подходит для меня. Надеюсь, вы сочтете это полезным 🙂