0

我有一个 XML 文件,其中包含带有一些非常简单的布局结构的文本:

<?xml version='1.0'?>
<page>
  <section>
    <header>Header</header>
    <par>Some paragraph</par>
    <par>Another paragraph with <emph>formatting</emph></par>
  </section>
</page>

然后在 PHP 中,我使用 SimpleXML 读取了这个文件(请注意,我故意剥离了其他标签!):

$page = file_get_contents("page.xml");
if ($page) {
  $stripped = strip_tags($page, "<?xml><page><section><header><par><emph>");
  $xml = new SimpleXMLElement($stripped);
}

现在我想遍历 XML 元素并将它们打印我网站的 HTML。最终结果应该是以下代码段:

<h1>Header</h1>
<p>Some paragraph
<p>Another paragraph with <i>formatting</i>

我已经浏览了 SimpleXML 和 XPath,并试图弄清楚如何遍历 XML 树以便我可以将原始 XML 文件消化成 HTML 输出。我可以产生一些想要的结果,但<emph></emph>它就消失了;我如何进一步下降到树中?到目前为止我的代码:

foreach ($xml->section as $s) {
  echo "<h1>" . $s->header . "</h1>";
  foreach ($s->par as $p) {
    echo "<p>" . $p;
    //  Do some magic here to ensure <emph> tags are recognized and responded to properly.
  }
}

任何提示和指针表示赞赏!谢谢 :-)

4

1 回答 1

0

好吧,没有答案,我只能自己做面条:-)所以这就是我所做的,结果很好。

原来SimpleXML的东西没有删减,所以我使用了XMLReader:

$xml = new XMLReader();

然后我手动解析 XML 字符串,从一个元素跳到另一个元素并对它们中的每一个进行操作:

if ($xml->xml($stripped)) { // $stripped here is a string that's been validated (see below).
  while (false !== $xml->read()) {
    $t = $xml->nodeType;
    if ($t === XMLReader::ELEMENT) {
      $n = $xml->name;
      switch ($n) {
        case "page":
        case "section":
          // Nothing to echo here.
          break;
        case "header":
          // Handle attributes here
          echo "<h1>";
          break;
        case "par":
          echo "<p> ";
          break;
        case "emph";
          echo "<i>"; // This can also open a <span> for more flexibility later.
          break;
        default:
          // Nothing should arrive here.
          echo "Gah!"
      }
    }
    else if ($t === XMLReader::END_ELEMENT) {
      ... // Close the opened tags here.
    }
    else if ($t === XMLReader::TEXT) {
      $s = $xml->readString();
      echo $s;
    }
    else {
      // Everything else are comments or white spaces.
    }
  }
}

你明白了。我基本上必须自己通过 XML 结构反弹,并根据元素类型手动处理元素的属性和节点。

事实上,这是一个两步的过程。您在此处看到的假设是有效的 XML 文档。我还有一个在上述代码之前运行的验证器,它确保正确的元素嵌套正确,并且根据我自己对嵌套、属性等的定义,给定的 XML 是“格式正确的”。验证器遵循完全相同的原则进行操作。

希望这可以帮助。

于 2012-11-07T07:02:57.167 回答