为什么getElementById在这种情况下不起作用?

时间:2011-09-11 07:19:03

标签: php dom 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但不满足我。我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

我遇到了同样的问题并得到了上面提到的相同答案。由于我不知道如何定义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');

此解决方案对我来说非常适合。我希望你发现它也很有用:)

答案 1 :(得分:2)

您必须传递定义id属性的DTD。否则,您无法使用getElementById

有关详细信息,请参阅: