在PHP中仅使用expat解析文档的一部分

时间:2011-12-14 08:26:16

标签: php xml-parsing expat-parser

我正在用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解析器需要一个字符串。所以我需要做两件事之一:

  1. 将DOM元素神奇地转换为保持所有标记完整的字符串,以便我可以在expat解析器中使用它。但是,如果我能做到这一点,我就不需要expat解析器,我可以直接回应那个转换后的字符串....

  2. 使用expat以外的其他内容。

  3. 顺便说一句,我知道我可以用<>替换XML中的&lt;&gt;,但这会使代码很难阅读和编辑。如果可能的话,我想避免它。

2 个答案:

答案 0 :(得分:0)

<?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

答案 1 :(得分:0)

D'哦。如果我在问这个问题之前只等了几分钟。

解决方案是将CDATA标签中的所有内容包装起来:

<xmlroot> 
  <page id="home"> 
    <![CDATA[
      <h1>An HTML Header Tag!</h1> 
      <p>This is a paragraph</p> 
    ]]>
  </page>
  [...etc]
</xmlroot>

然后我可以抓取page标记并使用$page->nodeValue输出内容。我提供这个,希望它能为别人带来我刚刚给自己带来的毫无意义的头痛。