【发布时间】:2010-12-11 19:42:41
【问题描述】:
我正在使用 PHP 递归循环来解析 XML 文档以创建嵌套列表,但是由于某种原因,循环被破坏并在列表中创建重复元素以及空白元素。
XML(家谱数据列表)的结构如下:
<?xml version="1.0" encoding="UTF-8"?>
<family>
<indi>
<id>id1</id>
<fn>Thomas</fn>
<bday></bday>
<dday></dday>
<spouse></spouse>
<family>
<indi>
<id>id1</id>
<fn>Alexander</fn>
<bday></bday>
<dday></dday>
<spouse></spouse>
<family>
</family>
</indi>
<indi>
<id>id1</id>
<fn>John</fn>
<bday></bday>
<dday></dday>
<spouse></spouse>
<family>
<indi>
<id>id1</id>
<fn>George</fn>
<bday></bday>
<dday></dday>
<spouse></spouse>
<family>
</family>
</indi>
</family>
</indi>
</family>
</indi>
</family>
这是我的 PHP 循环,它加载 XML 文件,然后循环遍历它以创建嵌套的 ul:
<?php
function outputIndi($indi) {
echo '<li>';
$id = $indi->getElementsByTagName('id')->item(0)->nodeValue;
echo '<span class="vcard person" id="' . $id . '">';
$fn = $indi->getElementsByTagName('fn')->item(0)->nodeValue;
$bday = $indi->getElementsByTagName('bday')->item(0)->nodeValue;
echo '<span class="edit fn">' . $fn . '</span>';
echo '<span class="edit bday">' . $bday . '</span>';
// ...
echo '</span>';
echo '<ul>';
$family = $indi->getElementsByTagName('family');
foreach ($family as $subIndi) {
outputIndi($subIndi);
}
echo '</ul></li>';
}
$doc = new DOMDocument();
$doc->load('armstrong.xml');
outputIndi($doc);
?>
在此处编辑期望的结果(嵌套列表,ul 表示家庭,li 表示个人)
<ul>
<li>
<span class="vcard">
<span class="fn">Thomas</span>
<span class="bday"></span>
<span class="dday"></span>
<ul>
... repeat for all ancestors ...
</ul>
<li>
<ul>
您可以在 http://chris-armstrong.com/gortin 看到输出。有什么想法我哪里出错了吗?我认为这与 $subIndi 值有关,但是每当我尝试更改它时,都会出现错误。非常感谢任何帮助!
【问题讨论】:
-
这看起来像是 xsl 的工作,您是否考虑改为 xsl 转换?
-
不好意思说我从来没有听说过 xsl,它是什么?
-
XSL 用于将 XML 从一种格式转换为另一种格式,请参阅 w3schools.com/xsl/default.asp。在您的情况下,您可以毫不费力地获取家谱并生成 XHTML 文档。
-
听起来很完美!你能给我举个例子吗?这是否意味着我可以将数据保存为 XML,然后将其作为嵌套的 ul 加载?
-
@Chris,要获得准确的帮助,发布您想要的输出示例会很有帮助。
标签: php xml parsing recursion xml-parsing