Php 如何以递归格式显示xml数据以显示数据的真实子/父关系
我试图以树格式显示XML源中的数据,以显示正确的父->子关系 问题是子节点本身可以有多个子节点(没有限制) 在闪存中工作的输出示例= 但是,我无法在PHP/html中复制这一点。 我在这里提供了一个示例XML源: 在其他人的帮助下,家长ID及其子女的列表如下:Php 如何以递归格式显示xml数据以显示数据的真实子/父关系,php,xml,recursion,multidimensional-array,treeview,Php,Xml,Recursion,Multidimensional Array,Treeview,我试图以树格式显示XML源中的数据,以显示正确的父->子关系 问题是子节点本身可以有多个子节点(没有限制) 在闪存中工作的输出示例= 但是,我无法在PHP/html中复制这一点。 我在这里提供了一个示例XML源: 在其他人的帮助下,家长ID及其子女的列表如下: <?php $content = file_get_contents('http://www.fluffyduck.com.au/sampleXML.txt'); $xml = new SimpleXMLElement($cont
<?php
$content = file_get_contents('http://www.fluffyduck.com.au/sampleXML.txt');
$xml = new SimpleXMLElement($content);
$users = array ();
myUserReader($xml->user, $users);
function myUserReader($node, &$users)
{
if (array_key_exists("{$node['id']}", $users) === false)
{
$users["{$node['id']}"] = array ();
}
if (isset($node->user))
{
for ($key = 0; ($key < count($node->user)); $key++)
{
$user = $node->user[$key];
if (!in_array("{$node['id']}", $users["{$node['id']}"]))
{
$users["{$node['id']}"][] = "{$user['id']}";
# $users["{$node['id']}"][] = $user;
}
myUserReader($user, $users);
}
}
}
foreach ($users as $parent => $children)
{
echo "{$parent}: " . implode(", ", $children) . "\n";
}
?>
用户,$users);
函数myUserReader($node,&$users)
{
如果(array_key_存在(“{$node['id']},$users)==false)
{
$users[“{$node['id']}”]=array();
}
if(isset($node->user))
{
对于($key=0;($keyuser));$key++)
{
$user=$node->user[$key];
如果(!在数组(“{$node['id']},$users[“{$node['id']}]”)中)
{
$users[“{$node['id']}”][]=“{$user['id']}”;
#$users[“{$node['id']}”][]=$user;
}
myUserReader($user,$users);
}
}
}
foreach($parent=>$children的用户)
{
echo“{$parent}:”.introde(“,”,$children)。“\n”;
}
?>
我无法计算出我需要什么代码来解析上述结果,并按照上面所附的图片显示信息
我曾考虑将XML转换为数组,但仍然有同样的问题,我尝试过的代码是:
function xmlstr_to_array($xmlstr) {
$doc = new DOMDocument();
$doc->loadXML($xmlstr);
return domnode_to_array($doc->documentElement);
}
function domnode_to_array($node) {
$output = array();
switch ($node->nodeType) {
case XML_CDATA_SECTION_NODE:
case XML_TEXT_NODE:
$output = trim($node->textContent);
break;
case XML_ELEMENT_NODE:
for ($i=0, $m=$node->childNodes->length; $i<$m; $i++) {
$child = $node->childNodes->item($i);
$v = domnode_to_array($child);
if(isset($child->tagName)) {
$t = $child->tagName;
if(!isset($output[$t])) {
$output[$t] = array();
}
$output[$t][] = $v;
}
elseif($v) {
$output = (string) $v;
}
}
if(is_array($output)) {
if($node->attributes->length) {
$a = array();
foreach($node->attributes as $attrName => $attrNode) {
$a[$attrName] = (string) $attrNode->value;
}
$output['@attributes'] = $a;
}
foreach ($output as $t => $v) {
if(is_array($v) && count($v)==1 && $t!='@attributes') {
$output[$t] = $v[0];
}
}
}
break;
}
return $output;
}
$moo = xmlstr_to_array($content);
print_r($moo);
函数xmlstr到数组($xmlstr){
$doc=新的DOMDocument();
$doc->loadXML($xmlstr);
将domnode_返回到_数组($doc->documentElement);
}
函数domnode_到_数组($node){
$output=array();
开关($node->nodeType){
案例XML\U CDATA\U节\U节点:
案例XML_文本_节点:
$output=trim($node->textContent);
打破
案例XML_元素_节点:
对于($i=0,$m=$node->childNodes->length;$ichildNodes->item($i);
$v=domnode_到_数组($child);
if(isset($child->tagName)){
$t=$child->tagName;
如果(!isset($output[$t])){
$output[$t]=array();
}
$output[$t][]=$v;
}
埃尔塞伊夫(五美元){
$output=(字符串)$v;
}
}
if(is_数组($output)){
如果($node->attributes->length){
$a=数组();
foreach($node->属性为$attrName=>$attrNode){
$a[$attrName]=(字符串)$attrNode->value;
}
$output['@attributes']=$a;
}
foreach($t=>v的输出){
if(is_数组($v)&&count($v)==1&&$t!='@attributes')){
$output[$t]=$v[0];
}
}
}
打破
}
返回$output;
}
$moo=xmlstr_到_数组($content);
印刷费($moo);
但是,同样的问题也存在,我不知道如何循环并以正确的父->子方式递归地显示信息
由于数据的构造方式,我也无法确定如何检索“单个”条目,如果我可以这样做,也许我可以手动重建树,我不确定如何进行,因为每个记录都没有唯一的标识符
非常感谢您的帮助。在本例中,最好避免使用DOM或SimpleXML,而是使用XSLT,因为XSLT是为处理递归而设计的。创建样式表,如下所示:
$xslt=new SimpleXMLElement('<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="*">
<ul>
<li><xsl:value-of select="local-name()"/>
<xsl:apply-templates/>
</li>
</ul>
</xsl:template>
</xsl:stylesheet>');
这只是一个简单的例子,但它应该生成一个长而无序的列表,其中包含正确嵌套的所有父级及其子级。修改“value of”指令以拉出您可能更愿意显示的属性等。对此进行了一次尝试,但收到:致命错误:调用成员函数transformToXML()在非对象上…您输入的代码与transformToXML的php文档是内联的,所以我不确定这个问题,除了它使用DOM,并且您在我的代码中列出了simplexmlTypo…请参见第二个代码块最后一行上方的编辑)。
$content = file_get_contents('http://www.fluffyduck.com.au/sampleXML.txt');
$xml = new SimpleXMLElement($content);
$xsl_processor = new XSLTProcessor();
$xsl_processor->importStylesheet($xslt);
echo $xsl_processor->transformToXml($xml);