powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / выборка с xpath
24 сообщений из 24, страница 1 из 1
выборка с xpath
    #37582339
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как с помощью xpath получить содержимое записей, внутри которых имеется еще запись с требуемыми параметрами, но само значение записи нужно взять отличное от проверяемого ? сразу извиняюсь за терминологию, в xpath я не особо часто погружаюсь. попробую пояснить примером :

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<td>
 <div class="data"><a href="123"></div>
</td>
<td>
 <div class="data"><a href="456"></div>
 <div class="findme">
</td>
<td>
 <div class="data"><a href="789"></div>
</td>


в этом примере мне нужно получить значение атрибута "456" рядом с которым присутствует findme , а 123 и 789 нужно пропустить.
...
Рейтинг: 0 / 0
выборка с xpath
    #37582446
StPatrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну если там только 1 или 2 записи с div, то можно так - выбираем все td, у которых у второго дива значение атрибута class - "findme", ну и потом берем первый div.

я на SQL Server работаю, потому скрипт оттуда:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
declare @xml xml

select @xml = '
<td>
 <div class="data"><a href="123"/></div>
</td>
<td>
 <div class="data"><a href="456"/></div>
 <div class="findme"/>
</td>
<td>
 <div class="data"><a href="789"/></div>
</td>
'

select
	T.C.value('div[1]/a[1]/@href', 'nvarchar(max)')
from @xml.nodes('td[div[2]/@class="findme"]') as T(C)
...
Рейтинг: 0 / 0
выборка с xpath
    #37582659
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StPatrick, так "нечестно". у меня не sql, а самый обычный xpath-парсер в perl. придется еще один дополнительный парсер инициализировать.
я думаю можно одно выражение изобразить.
...
Рейтинг: 0 / 0
выборка с xpath
    #37582830
StPatrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а что надо получить в результате? xml, где остались только нужные дивы?
...
Рейтинг: 0 / 0
выборка с xpath
    #37582881
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StPatrick, я анализирую данные и СНОВА xml мне не нужен. мне нужен массив атрибутов href.
...
Рейтинг: 0 / 0
выборка с xpath
    #37582907
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/td[div[@class='findme']]/div[@class='data']/a/@href
...
Рейтинг: 0 / 0
выборка с xpath
    #37582930
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy, круто. а как подобная нотация называется? мне чтобы подробнее осознать и применять в дальнейшем
...
Рейтинг: 0 / 0
выборка с xpath
    #37583019
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В смысле нотация? Это xpath-запрос, который ты просил, выбирающий то, что ты просил.
Документация по xpath есть здесь , хотя в каких-то экзотических случаях отличия парсера FW4 от перловского по-любому будут.
На всякий случай: перла не знаю, и куда ему воткнуть запрос, не ведаю.
...
Рейтинг: 0 / 0
выборка с xpath
    #37583023
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netwind,

называется она XPath, описана, например, на w3.org
чтобы ее осознать и постоянно с ней работать, нужен опыт, сначала писать простые XPath, потом будут получаться любые.
основное применение XSL.
...
Рейтинг: 0 / 0
выборка с xpath
    #37583901
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyВ смысле нотация?
/td[div[@class='findme']] - вот такой нотации я раньше не видел, не использовал и не нашел с ходу где описано то, что внутри скобок [] можно просто указать еще одно выражение xpath.
...
Рейтинг: 0 / 0
выборка с xpath
    #37583994
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netwindAntonariyВ смысле нотация?
/td[div[@class='findme']] - вот такой нотации я раньше не видел, не использовал и не нашел с ходу где описано то, что внутри скобок [] можно просто указать еще одно выражение xpath.Вообще термин "нотация" здесь если куда и подходит, то к самому xpath, а [[]] — конструкция этой нотации.

Я ее видел среди примеров здесь .
...
Рейтинг: 0 / 0
выборка с xpath
    #37584107
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy, теперь и я видел. но где конкретно в документации это разрешено? всякие там функции в скобках [] - этого навалом
...
Рейтинг: 0 / 0
выборка с xpath
    #37585350
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netwind,

Вы доку то читали?
http://www.w3.org/TR/xpath/

специально полез, думал чего не написано... так ведь нет, про то что [position() = 1] можно писать как [1], про то что [cond1][cond2] аналогично [cond1 and cond2] тоже есть, про то что в скобках [] указывается любое выражение, которое в состоянии вернуть boolean и то написано.
...
Рейтинг: 0 / 0
выборка с xpath
    #37585483
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mage.lan,

Там вроде нет про вложенные квадратные скобки.
...
Рейтинг: 0 / 0
выборка с xpath
    #37585721
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитайте про преобразование node-set в boolean
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
выборка с xpath
    #38142756
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Снова принципиальная непонятка, которую чтением списка функций не удалось решить.
Хочется покрасивее обойти ситуацию отсутствующего поля
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<p>
 <phone>123</phone>
</p>
<p>
</p>
<p>
 <phone>456</phone>
</p>


Я обрабатываю это xpath-выражением "//phone" и получаю массив из двух значений phone.
Какое должно быть выражение, чтобы вернулось и пустое поле тоже? То есть, массив из трех значений с одним пустым.
Разумеется, структура упрощена, но смысл тот же.

Переделывать на педальный двухуровневый парсинг записей (сначала выделить записи P, а потом парсить каждую ) мне невыгодно из-за особенностей построения программы. Для читаемости нужно сосредоточить все xpath-выражения в одном месте
...
Рейтинг: 0 / 0
выборка с xpath
    #38143147
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netwind,

очевидно, что ваш икспас должен быть /p и никак по другому, нельзя выбрать то, чего нет.
если вы шире опишите свою задачу, мы подумаем, как красиво написать xsl
...
Рейтинг: 0 / 0
выборка с xpath
    #38143181
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mage.lan, понимаю. Но разве нельзя отсутствующие элементы выбрать, например, как пустую строку? Конечно же хотелось бы в принципе подобные задачи решать красиво.

Конкретно сейчас это парсинг текущей структуры html яндекс-каталога. В некоторых позициях есть телефон, а в некоторых нет.
Соответственно, я выбираю например упорядоченный массив названий, которые есть всегда, одним выражением и рядом пытаюсь выбрать другим выражением упорядоченный (!) массив телефонов. Дальше обрабатываю и тут мне нужно сопоставить названия и телефоны.

Вероятно, я мог бы переписать это в два уровня - сначала выделить элементы одним выражением, а другим набором выражений обрабатывать каждый, но мне удобней сразу список с полями получить.

Неужели это совсем не как у всех ?
...
Рейтинг: 0 / 0
выборка с xpath
    #38143222
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде это похоже на вашу задачу.
...
Рейтинг: 0 / 0
выборка с xpath
    #38143234
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netwind,

совсем.
могу только посоветовать следующее
если микрософт объявляем пространство имен msxsl
Код: xml
1.
2.
3.
4.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
...
>


далее перед использованием создаем переменную
Код: xml
1.
2.
3.
4.
5.
6.
7.
<xsl:variable name="_phones">
    <xsl:for-each select="/p">
         <phone>
             <xsl:value-of select="phone/text()" />
         </phone>
    </xsl:for-each>
</xsl:variable>


Далее переводим ее в фрагмент дерева, если микрософт
Код: xml
1.
<xsl:variable name="phones" select="msxsl:node-set($_phones)/phone" />


если не микрософт - читайте инструкцию к трансформеру, в том или ином виде функция node-set (nodeset) есть у всех XSLT

Переменная будет содержать то, что вы хотите.
...
Рейтинг: 0 / 0
выборка с xpath
    #38143251
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mage.lan, да у меня нет трансформера и мало смысла их вообще осваивать.
Модуль получает набор xpath-выражений и создает удобные структуры данных в языке. Я просто хочу получить массивы для дальнейшей обработки без xml.
Мне не надо из ентерпрайза в другой что-то отправлять. Все у меня просто.
...
Рейтинг: 0 / 0
выборка с xpath
    #38143293
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mage.lan, я правильно понимаю что если я попробую погрузитьс в трансформацию с XSLT, то пойму о чем вы говорите и приведу исходный html к более удобному для разбора теми методами, которые мне удобнее?
Я использую perl и Web::Scraper. Код очень простой и компактный.
...
Рейтинг: 0 / 0
выборка с xpath
    #38143734
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netwind,

Увы, я не знаю, что такое Web::Scraper, помочь не смогу.

А Яндекс-каталог как-нибудь еще получить можно? в виде нормального xml или json?
...
Рейтинг: 0 / 0
выборка с xpath
    #38143787
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mage.lan, perl вообще мало кто использует поэтому я и пояснил как такой парсер оперирует.

в данной ситуации набор выражений для Web::Scraper выглядит так . некоторые странные символы в xpath - последовательности для экранировани. Последовательность \' - экранирует одиночную кавычку.
Код: php
1.
2.
3.
4.
5.
    my $page = scraper {
	process '//h3[@class=\'b-result__head\']/a[@class=\'b-result__name\']','names[]','TEXT'; 
	process '//div[@class=\'b-result__layout__r\']/p[2]/text()[1]','phones[]','TEXT'; # это выражение и пропускает телефоны
	process '//li[@class=\'b-result__item\']','elements[]','RAW'; 
    };



То есть, будет создан массив names и еще массив phones, где число элементов меньше чем нужно, потому что совпадения не нашлось.
Ну а третье выражение позволяет мне просто получить кусок html (RAW) в массив elements, который я потом более традиционными для perl методами выбираю данные.
Т.е. практическую задачу я давно решил. Теперь интересует более изящная методика. Есть ли у яндекса json или xml в сущности не важно.


И так, если в xml отсутствуют поля в записей, могу я с помощью каких-либо xslt-преобразований их добавить с пустыми значениями?
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / выборка с xpath
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]