【问题标题】:How to get simplexml child from multiple nodes in php如何从 php 中的多个节点获取 simplexml 子节点
【发布时间】:2015-04-30 20:03:47
【问题描述】:

我想在 HTML 页面上列出各种截止日期的日历。我使用 XML 文件作为源,编辑工作量不大。问题是在页面上获得正确的内容。

这有点像 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 得到类似这样的输出:

January
15. deadline 1
    deadline 2
    deadline 3

24. deadline 4
    deadline 5

30. deadline 6
    deadline 7

February
6. deadline 8
......

如果有人了解我想要什么,并且可以帮助我,将不胜感激。

【问题讨论】:

  • 那不是有效的 XML。看看w3schools.com/xmlxmlvalidation.com
  • 您也应该将到目前为止的代码添加到您的问题中。让你有问题的地方更清楚。

标签: php html simplexml nodes children


【解决方案1】:

@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

【讨论】:

    【解决方案2】:

    引用你的问题...

    我使用一个 XML 文件作为源代码,编辑工作量不大

    ... 我假设您可以控制 XML 源文件,所以我可以建议您在尝试解析它之前做一些细微的修改以使其成为有效的 XML 吗?这是修改后的 XML 最终结果的示例:

    <?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>
    

    解析此代码的示例代码,生成所需的输出:

    $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>";
        }
    }
    

    输出(为清楚起见缩进):

    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>

    【讨论】:

      猜你喜欢
      • 2014-08-06
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 2011-08-01
      • 2010-11-11
      • 2013-03-27
      相关资源
      最近更新 更多