Почему getElementById не работает в этом случае? - PullRequest
1 голос
/ 11 сентября 2011

У меня есть кусок кода 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, но не удовлетворяет меня. Я что-то пропустил?

Ответы [ 2 ]

3 голосов
/ 25 октября 2011

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

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

<section id="content" />

в

<section xml:id="content" />

Если вам все еще нужен атрибут id для apear (для целей 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');

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

2 голосов
/ 11 сентября 2011

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

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

...