2015-03-19 4 views
0

Я пытаюсь получить информацию о курсе, чтобы показать название курса, описание и местоположение, у которых есть текст, который содержит марш и игнорирует курсы, которые, например, в апреле.PHP Xpath Invalid Expression

Вот мой XML:

<div class="main"> 
    <div class="workshoplist-main"> 
     <div class="toggler pointer"> 
      <i class="icon-chevron-down"></i> 
      <span id="rpt_0_lblSectionHeader_0">Wednesday, March 18, 2015 (10:00 AM - 11:00 AM)</span> 
     </div> 
     <div class="accordion-element"> 
      <div class="element"> 
       <p>Course title: Math 100</p> 
       <p>Description: Math</p> 
       <p>Location: SSD1</p>     
      </div> 
     </div> 
     <div class="toggler pointer"> 
      <i class="icon-chevron-down"></i> 
      <span id="rpt_0_lblSectionHeader_0a">Wednesday, April 18, 2015 (10:00 AM - 11:00 AM)</span> 
     </div> 
     <div class="accordion-element"> 
      <div class="element"> 
       <p>Course title: English 100</p> 
       <p>Description: English</p> 
       <p>Location: BBD1</p>     
      </div> 
     </div> 
     <div class="toggler pointer"> 
      <i class="icon-chevron-down"></i> 
      <span id="rpt_0_lblSectionHeader_0b">Thursday, March 19, 2015 (10:00 AM - 11:00 AM)</span> 
     </div> 
     <div class="accordion-element"> 
      <div class="element"> 
       <p>Course title: History 100</p> 
       <p>Description: History</p> 
       <p>Location: ADD</p>      
      </div> 
     </div> 
    </div> 
    <div class="workshoplist-main"> 
     <div class="toggler pointer"> 
      <i class="icon-chevron-down"></i> 
      <span id="rpt_0_lblSectionHeader_1">Thursday, April 16, 2015 (10:00 AM - 11:00 AM)</span> 
     </div> 
     <div class="accordion-element"> 
      <div class="element"> 
       <p>Course title: Math 105</p> 
       <p>Description: Math</p> 
       <p>Location: SSD2</p>     
      </div> 
     </div> 
    </div> 
    <div class="workshoplist-main"> 
     <div class="toggler pointer"> 
      <i class="icon-chevron-down"></i> 
      <span id="rpt_0_lblSectionHeader_2">Friday, March 19, 2015 (10:00 AM - 11:00 AM)</span> 
     </div> 
     <div class="accordion-element"> 
      <div class="element"> 
       <p>Course title: Chemistry 100</p> 
       <p>Description: Chemistry</p> 
       <p>Location: ADD</p>      
      </div> 
     </div> 
    </div> 
</div> 

Вот мой XPATH, что я написал в PHP:

$details = $node->xpath("//div[@class='toggler pointer']/span[contains(@id,'lblSectionHeader')][contains(text(), 'March')]/following-sibling::/*"); 

Результат Я хотел бы видеть это:

Wednesday, March 18, 2015 (10:00 AM - 11:00 AM) 
    Course title: Math 100 
    Description: Math 
    Location: SSD1 

Thursday, March 19, 2015 (10:00 AM - 11:00 AM) 
    Course title: History 100 
    Description: History 
    Location: ADD 

Do не показывать все курсы английского языка

Проблема в том, что я не могу получить

<div class="element"> 

для извлечения значения, конечно, описание, расположение

+0

Поскольку вы используете XPath в PHP, я думаю, мы можем предположить, что это XPath 1.0 - XPath 2.0 недоступен. Исправьте меня, если это предположение неверно. – LarsH

+0

next-sibling :: выберет следующий родной узел контекстного узла. Поскольку я вижу, что ваш контекстный узел является span в этой точке, вы должны вернуться и поместить ../ перед следующим браком. Попробуйте это и посмотрите, работает ли оно. – Mark

ответ

1

following-sibling:: не может быть сразу после /, так что вы должны получить сообщение об ошибке. Если вы видите ошибку, вы должны рассказать нам об этом, а не опустить эту подсказку. Вы можете изменить следующую часть-брата до ../following-sibling::*, но вы бы выбрали гораздо больше, чем хотите.

Я думаю, что вам нужно, чтобы сначала выбрать пролеты с соответствующими датами, как вы сделали:

$details = $node->xpath("//div[@class='toggler pointer']/ 
    span[contains(@id,'lblSectionHeader')][contains(text(), 'March')]"); 

Тогда итерацию над ними, и для каждого диапазона, выберите

"(../following-sibling::div[@class='element'])[1]" 

или

"(following::div[@class='element'])[1]" 

Любой из них предоставит вам соответствующий элемент div, из которого вы можете просто выбрать каждый <p> ребенок.

Если у вас возникли проблемы с этим последним шагом (извлечение данных из дочерних элементов <p>), покажите, какой код вы пытались, каким был результат и какой результат вы хотели для этого фрагмента кода (вы показали желаемый общий результат уже).

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