2015-04-30 1 views
0

Я хочу сделать список календаря на сроках varius на HTML-странице. Я использую XML-файл в качестве источника, который не требует много работы для редактирования. Проблема состоит в том, чтобы получить правильную композицию контента на странице.Как получить дочерний элемент simplexml из нескольких узлов в php

Это несколько, как 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, поэтому я могу предложить вам выполнить некоторые действия Легкие модификации, чтобы сделать его действительным 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>"; 
    } 
} 

Output (с отступом для ясности):

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>

 Смежные вопросы

  • Нет связанных вопросов^_^