2015-04-30 230 views
0

我想在HTML页面的varius最后期限上创建日历列表​​。我正在使用一个XML文件作为源代码,并不需要太多工作来编辑。麻烦在于在页面上显示正确的内容。如何从php中的多个节点获取simplexml子节点

这有点XML将如何为:

<?xml version="1.0" encoding="UTF-8"?> 
<type> 
<part1> 
<month> 
january 
<date> 
15. 
<deadline> 
deadline 1 
deadline 2 
deadline 3 
</deadline> 
</date> 

<date> 
24. 
<deadline> 
deadline 4 
deadline 5 
</deadline> 
</date> 

<date> 
30. 
<deadline> 
deadline 6 
deadline 7 
</deadline> 
</date> 
</month> 

<month> 
february 
<date> 
6. 
<deadline> 
deadline 8 
deadlline 9 
</tekst> 
</date> 
</month> 

</part1> 
</type> 

我需要一个PHP代码来获得每个月在每个日期各期限到页。 我尝试使用“foreach”蚂蚁得到了几个月,但当我在节点上有孩子时遇到了问题。

我想PHP直到得到somwhat这样的输出:

January 
15. deadline 1 
    deadline 2 
    deadline 3 

24. deadline 4 
    deadline 5 

30. deadline 6 
    deadline 7 

February 
6. deadline 8 
...... 

如果有人知道我想要什么,并能帮助我,将不胜感激。

+1

这是无效的XML。看看http://www.w3schools.com/xml/和http://www.xmlvalidation.com/ – starf

+0

你应该添加到目前为止你的问题以及代码。这样,你有问题的地方就会变得更加清晰。 – hakre

回答

0

@starf是对的,它是不正确的XML。但这并不妨碍我们解析它。对于最高级别,我们使用XML解析器,最低的一个 - php函数。这是工作的代码

<? 
$str = '<?xml version="1.0" encoding="UTF-8"?> 
<type> 
<part1> 
<month> 
january 
<date> 
15. 
<deadline> 
deadline 1 
deadline 2 
deadline 3 
</deadline> 
</date> 

<date> 
24. 
<deadline> 
deadline 4 
deadline 5 
</deadline> 
</date> 

<date> 
30. 
<deadline> 
deadline 6 
deadline 7 
</deadline> 
</date> 
</month> 

<month> 
february 
<date> 
6. 
<deadline> 
deadline 8 
deadlline 9 
</deadline> 
</date> 
</month> 

</part1> 
</type>'; 

$cal = new SimpleXMLElement($str); 



$nmonth=0; 
foreach($cal->part1->month as $month) { 
    echo $month.'<br/>'; 
    $ndate = 0; 
    foreach($cal->part1->month[$nmonth]->date as $date) { 
     echo $date.'<br/>'; 
//   print_r($cal->part1->month[$nmonth++]->date[$ndate]->deadline); 
     foreach($cal->part1->month[$nmonth]->date[$ndate]->deadline as $deadline) { 
      $dead = preg_split('/\n/', $deadline); 
       foreach ($dead as $d) 
       if (!empty($d)) echo $d.'<br/>'; 
     } 
    $ndate++; 
    } 
    $nmonth++; 
} 

结果:

january 
15. 
deadline 1 
deadline 2 
deadline 3 
24. 
deadline 4 
deadline 5 
30. 
deadline 6 
deadline 7 
february 
6. 
deadline 8 
deadlline 9 
0

引用您的问题...

我使用一个XML文件作为来源,是不是太多的工作编辑

...我假设你在控制XML源文件,所以我建议你做一些s在尝试解析它之前进行轻微修改以使其成为有效的XML?这是经修改的XML可能如何结束等的例子:(缩进为了清楚)

$xml = new SimpleXMLElement($source); // $source is XML content above 

foreach ($xml->part1->month as $month) { 
    echo $month['name']; 

    foreach ($month->day as $day) { 
     echo "<ol>"; 
     echo '<li value="', $day['number'] . '.' , '">'; 
     echo implode('<br />', (array)$day->deadline); 
     echo '</li>'; 
     echo "</ol>"; 
    } 
} 

输出::

<?xml version="1.0" encoding="UTF-8"?> 
<type> 
    <part1> 
     <month name="January"> 
      <day number="15"> 
       <deadline>Deadline 1</deadline> 
       <deadline>Deadline 2</deadline> 
       <deadline>Deadline 3</deadline> 
      </day> 

      <day number="24"> 
       <deadline>Deadline 4</deadline> 
       <deadline>Deadline 5</deadline> 
      </day> 

      <day number="30"> 
       <deadline>Deadline 6</deadline> 
       <deadline>Deadline 7</deadline> 
      </day> 
     </month> 

     <month name="February"> 
      <day number="6"> 
       <deadline>Deadline 8</deadline> 
       <deadline>Deadline 9</deadline> 
      </day> 
     </month> 
    </part1> 
</type> 

实施例的代码解析此,生成所期望的输出

January 
 
<ol> 
 
    <li value="15."> 
 
    Deadline 1<br/> 
 
    Deadline 2<br/> 
 
    Deadline 3 
 
    </li> 
 
</ol> 
 
<ol> 
 
    <li value="24."> 
 
    Deadline 4<br/> 
 
    Deadline 5 
 
    </li> 
 
</ol> 
 
<ol> 
 
    <li value="30."> 
 
    Deadline 6<br/> 
 
    Deadline 7 
 
    </li> 
 
</ol> 
 

 
February 
 
<ol> 
 
    <li value="6."> 
 
    Deadline 8<br/> 
 
    Deadline 9 
 
    </li> 
 
</ol>

相关问题