У меня есть часть кода 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');
Это решение идеально подходит для меня. Надеюсь, вы сочтете это полезным 🙂