我正在PHP中构建一个网站,其中内容存储在XML文件中。基本上,我只有一个index.php
页面,它检查查询字符串并从XML提供适当的页面。
例如,输入www.mysite.com/?page=home
将导致PHP脚本检查XML文件中是否有<page id="home">
标记,并将该标记内的内容粘贴到index.php
中。
<page>
标签的内容存储为HTML,因此:
<xmlroot>
<page id="home">
<h1>An HTML Header Tag!</h1>
<p>This is a paragraph</p>
</page>
[...etc]
</xmlroot>
我希望能够抓住适当的<page>
标签,并以某种方式解析内容。我知道<page>
标签中的所有内容都是有效的HTML,所以我只是打算使用expat来运行标签并将它们直接返回echo
。
所以我使用DOMDocument
方法来找到正确的<page>
,它工作得很好,除了内容作为DOM元素返回。expat解析器需要一个字符串。所以我需要做两件事之一:
神奇地将DOM元素转换为保持所有标记完整的字符串,以便我可以在expat解析器中使用它。然而,如果我能做到这一点,我就不需要expat解析器,我可以直接回显转换后的字符串....
不要用expat。
<
和>
替换XML中的<
和>
,但这使得代码很难阅读和编辑。
<?php
$doc = new DOMDocument('1.0');
$root = $doc->createElement('html');
$root = $doc->appendChild($root);
$head = $doc->createElement('head');
$head = $root->appendChild($head);
$title = $doc->createElement('title');
$title = $head->appendChild($title);
$text = $doc->createTextNode('< This is the title >');
$text = $title->appendChild($text);
echo $head->ownerDocument->saveXML($head);
DOMDocument::saveXML()接受$node参数,只输出一个特定的节点
http://www.php.net/manual/en/domdocument.savexml.php
D'oh。要是我多等几分钟再问这个问题就好了。
解决方案是将所有内容都封装在CDATA标签中,这样:
<xmlroot>
<page id="home">
<![CDATA[
<h1>An HTML Header Tag!</h1>
<p>This is a paragraph</p>
]]>
</page>
[...etc]
</xmlroot>
然后我可以抓取page
标记并使用$page->nodeValue
输出内容。我提供这些是希望它能让别人省去我刚刚给自己带来的无谓的头痛。