Почему в этом случае не работает 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 (основной.html):

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

HTML (обертка.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 (контент.html):

<section id="content" />

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

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

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

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


person Sudlik    schedule 11.09.2011    source источник


Ответы (2)


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

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

person Rob W    schedule 11.09.2011

У меня была та же проблема, и я получил тот же ответ, упомянутый выше. Поскольку я не знаю, как определить 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');

Это решение работает идеально для меня. Я надеюсь, что вы найдете это полезным, а также:)

person Noam Ashbell    schedule 25.10.2011