递归函数读取PHP

时间:2015-05-13 06:37:21

标签: php xml recursion

我想要一个代码来读取xml文件并递归获取其所有节点值并检查节点的级别。每个节点都打印一次,如果节点级别为2或大于2,则在节点名称前打印一个文本字段。但我没有得到任何节点值。提前谢谢你

我的代码:

<!DOCTYPE html>
<html>
<head> INSERT VALUES OF THE GIVEN PHRASE IDS : </head>
<!-- <head> <link rel="stylesheet" type="text/css" href="style.css" /></head> -->
<body>

<form name="form" action="xmlform.php" method="post">

<?php

echo ("<pre>");

$file="english.xml";

if(file_exists($file))
{
  $xml=simplexml_load_file("$file") or die("Error: Cannot create object");

foreach ($xml as $xmlRoot => $value) {
    $lvl=0;
    $xmlNode=$value->children();

    //if(is_null($value->children())) {echo "true";}exit();
   echo '<input type="text" name="xmlNode" value="'.$xmlNode.'" > <br>';

  function makeAFieldForNode($xmlNode, $lvl) {
    if ($lvl >= 2) {
         echo '<input type="text" value="" name="value"> <br>';
    } 
        $newLvl =   $lvl++;
        foreach ( $xmlNode->children() as $xn) {
        makeAFieldForNode($xN, $newLvl);  
     }
} 

makeAFieldForNode();

}

}

echo ("</pre>");


?>
</form>
</body>
</html>  

english.xml

<?xml version="1.0"?>
<?xml-stylesheet href="catalog.xsl" type="text/xsl"?>
<!DOCTYPE catalog SYSTEM "catalog.dtd">
<catalog>
   <product description="Cardigan Sweater" id="123" value="" product_image="cardigan.jpg">
      <catalog_item gender="Men's">
         <size description="Medium">
            <color_swatch image="red_cardigan.jpg" id="color" value="Red"/>
             <color_swatch image="burgundy_cardigan.jpg" id="color" value="burgundy"/>
         </size>
         <size description="Large">
           <color_swatch image="red_cardigan.jpg" id="color" value="Red"/>
            <color_swatch image="burgundy_cardigan.jpg" id="color" value="burgundy"/>
         </size>
      </catalog_item>
   </product>
</catalog>

如果你看到上面的xml文件,我想要一个输出中的表单我想要这样的东西

catalog
     product
      123  (123 is id and text field for value infront of it )
                catalog-item
                     size
                         color_swatch
                          color (color id id of color_swatch and text field for value)

所以,如果我在提交按钮上添加一些值,我可以生成一个新的xml文件,就像已经存在但具有各个元素的id值的新值。目前我正在尝试使用xml文件的所有元素生成该表单。我想要一个动态代码,所以无论它是什么xml文件。我的代码应该读取每个元素并读取它并给出id和text字段的值。我希望你明白我的观点。

1 个答案:

答案 0 :(得分:1)

小心增量运算符的位置:

$newLvl =   $lvl++;

$newLvl会在增量之前获得$lvl 的值(请参阅http://3v4l.org/aj7t3

在您的情况下,您甚至不需要新变量,只需执行$lvl++并在函数调用中使用它:

$lvl++;
foreach ( $xmlNode->children() as $xn) {
    makeAFieldForNode($xN, $lvl);  
}

编辑:要做出更完整的答案,我需要知道你的意思:

  

节点值

  

打印每个节点

因为您的某些节点没有value属性(例如productsize)。

如果您可以提供您想要获得的输出示例,那将有助于了解您的需求。

<小时/> ==编辑:添加脚本==

试试这个:http://3v4l.org/UspVk