我有一段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
但不满足我。我错过了什么吗?
答案 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
。
有关详细信息,请参阅: