Как получить дочерний Simplexml от нескольких узлов в переполнении стека

Я хочу составить список календарей по срокам исполнения на 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
......

Если кто-нибудь поймет, что я хочу, и сможет мне помочь, это будет оценено.

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, поэтому могу ли я предложить вам внести небольшие изменения, чтобы сделать его действительным 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>
0