Обновлен;см. ниже.
Было бы полезно, если бы вы сообщили нам, каков вывод кода, который вы пробовали до сих пор.Это поможет нам узнать, что уже работает, а что все еще сломано.Тем не менее, вот что я вижу, глядя на ваше использование XPath и DOM.(Отказ от ответственности: мой опыт в XPath и DOM, а не в PHP.)
$res = $xp->query( "//*[@class='one' or @class='two' or @class='spreadsheet']" );
Этот запрос XPath даст вам все узлы <span>
и <table>
в вашем образце, потому что это элементы, которыеесть классы, которые вы просили.
foreach ($res as $dn) {
Итерации по элементам span и table.Внутри этого цикла вы, вероятно, захотите сказать if ($dn->getAttribute("class") == "one") ...
и, если это так, начните новую неделю в вашей структуре массива;если класс «два», добавьте новый день недели к текущей неделе и т. д.
$nodes = $dn->childNodes;
Здесь вы запрашиваете дочерние узлы текущего диапазона или элемента таблицы.Для промежутка единственный показанный вами дочерний узел - это текстовый узел, такой как «другой день недели».Для элемента таблицы мы предполагаем, что есть tr
элементов и т. Д.
foreach ($nodes as $node) {
Итерации по одному текстовому узлу в диапазоне (или дочерним элементам таблицы):
if ($node->nodeValue != "") {
echo $node->nodeValue;
}
Печатать текстовое содержимое текстового узла (дочернего элемента span
);или 'null', если мы смотрим на элемент (например, tr
дочерний элемент table
).
Так, похоже, и делает приведенный выше код.Если это не так, как описано, опубликуйте информацию о фактическом выводе , и мы сможем помочь.Если он работает так, как описано, но вам нужна помощь в части создания недельных элементов массива, сообщите нам об этом.
Обновление:
Я бы предложил использовать этоЗапрос XPath:
$weeks = $xp->query( "//*[@class='one']" );
, чтобы получить номера узлов недели.Затем выполните итерации по ним:
foreach ($weeks as $week) {
$weekNum = $week->firstChild->nodeValue;
Получает номер недели из первого дочернего элемента (текстового узла) промежутка недели.
Создайте запись массива для новой недели.Затем выберите потенциальные узлы дня недели для этой недели:
$spans = $xp->query( "following::span[@class='one' or @class='two']", $week );
Второй аргумент $xp->query()
- это узел контекста, с которого начинается ось following::
.
Итерируйте по этим:
foreach ($spans as $span) {
Когда вы переходите на другую неделю, остановитесь:
if ($span->getAttribute("class") == "one") break;
В противном случае дважды проверьте, что это будний день:
if ($span->getAttribute("class") == "two") {
, затем добавьте новыйдень недели для вашего массива.Чтобы получить данные таблицы (исправлена ошибка) :
$table = $xp->query("following-sibling::table[1]", $span->parentNode);
Обновление: Чтобы получить данные таблицы, вам нужно настроить больше цикловкак и выше.Что-то вроде:
$rows = $xp->query("tr", $table);
, чтобы получить строки таблицы.Затем переберите те, у которых есть foreach, и внутри них,
$cells = $xp->query("td", $row);
И когда вы будете перебирать ячейки, ваши данные будут
$cell->firstChild->nodeValue
, то есть текстом дочернего текстового узла.Обратите внимание, что это не будет работать должным образом, если у вас есть элементы внутри ячеек <td>
.
Если вам нужна помощь в создании и заполнении массивов в PHP, я не тот человек, который бы советовал вам об этом, поскольку я 'Я не являюсь разработчиком PHP.
Обратите внимание, что все это не проверено.НТН.