XPath, following-sibling:: i selectNodes

0

Na wstępie: Nie mam ochoty na kolejne przepychanki, więc proszę personalnie 123oho o powstrzymanie się ze swoimi zgryźliwymi uwagami, oraz wszystkich pozostałych o wybujałym ego o przystopowanie. Proszę rzeczowo.


Walczę z zapytaniami XPathowymi w Delphi 7.

Używam standardowych komponentów dostępnych w Delphi + MSXML2_TLB.

Kiedy za pomocą metody selectNodes próbuję poszukać elementu następującego w drzewie po elemencie spełniającym warunek za pomocą following-sibling:: wywala mi błędy, że w okolicy ":" oczekiwano tokenu eof (sic!)

Żeby było bardziej obrazowo. Pobieram sobie kod HTML (za pomocą TWebBrowser) np. z tej strony:

https://prog.nfz.gov.pl/APP-JGP/GrupaSzczegoly.aspx?id=39SOMy4gZizarMBqZxjD6Ji38X0a74Fc

przerabiam go tak, żeby zaakceptował go IXMLDomDocument2 (tak na prawdę to dodaję znaki -> " <- w niektórych miejscach przy atrybutach i domykam niektóre znaczniki znakiem -> / <- - np. BR).

Zapytania XPath, nawet te dosć skomplikowane działają, ale kiedy np. chcę wykonać:

//DIV[@class="form" and DIV[@class="linia"]/DIV[text()="02 - KUJAWSKO-POMORSKI"]]/following-sibling::DIV[1]/TABLE/TBODY/TR/TD[@class="prawa"]/SPAN/text()

Dostaję błąd, że "oczekiwano tokenu 'eof' a znaleziono ':'"

To samo zapytanie odpalone np. w XMLSpy robi robotę i znajduje to czego oczekuję.

Podobna sytuacja jest z niektórymi metodami - np. position()

OmniXML w ogóle nie łyka tak spreparowanej strony HTML. Wdaje mi się, że interface IXMLDomDocument2 nie kuma niektórych operatorów, które widać pojawiły się później.

W dokumentacji Microsoftu:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms760218(v=vs.85).aspx

opisany jest IXMLDomDocument3, którego nie mogę wykorzystać w D7 (zresztą z tego co rozumiem niewiele wnosi do sprawy).

Ma ktoś pomysł jak rozwiązać ten problem ?

0

Na wstępie: Nie mam ochoty na kolejne przepychanki, więc proszę personalnie 123oho o powstrzymanie się ze swoimi zgryźliwymi uwagami, oraz wszystkich pozostałych o wybujałym ego o przystopowanie. Proszę rzeczowo.

Jejku dobrze, że nie o mnie mowa bo ja jestem -123oho. Jakaś moja marna podróbka. Wybujałego ego nie mam, więc się kwalifikuję do odpowiadania.
To czy odpowiem rzeczowo czy nie zależy od poziomu pytania, niestety ty usiłujesz mnie sprowokować do odpowiedzi. Nie jestem pewien czy wiesz co robisz.

Ma ktoś pomysł jak rozwiązać ten problem ?

Co usiłujesz osiągnąć bo póki co to mi się wydaje że złej technologii używasz do rozwiązania swojego problemu, zwłaszcza po tym:

przerabiam go tak, żeby zaakceptował go IXMLDomDocument2 (tak na prawdę to dodaję znaki -> " <- w niektórych miejscach przy atrybutach i domykam niektóre znaczniki znakiem -> / <- - np. BR).

0

Jeżeli otworzysz stronę, do której podałem link - sprawa będzie dość jasna:

Próbuję pobrać dane z tabelek, które m.in. tam się znajdują. Jak poklikasz trochę po tej stronie, zobaczysz, że danych jest ogrom i łatwie jest to zrobić XPathem, niż metodami około HTMLowymi.

To jest kontunuacja tego wątku:
http://4programmers.net/Forum/Delphi_Pascal/128077-jak_pobrac_dane_ze_strony_www_w_twebbrowser

Mam już stworzoną cała maszynkę, która robi robotę i na prawdę nie chcę z tobą dyskutować na temat "błędów technologicznych".

Oczekuję precyzyjnej odpowiedzi na postawione pytanie. Twoja odpowiedź nie była ani rzeczowa, ani wnosząca cokolwiek do sprawy.

0

Jeżeli otworzysz stronę, do której podałem link - sprawa będzie dość jasna:

Próbuję pobrać dane z tabelek, które m.in. tam się znajdują. Jak poklikasz trochę po tej stronie, zobaczysz, że danych jest ogrom i łatwie jest to zrobić XPathem, niż metodami około HTMLowymi.

Nie jestem wróżką. Stronę otworzyłem wcześniej i niestety nie było dla mnie tak oczywiste co ty tak na dobrą sprawę chcesz zrobić.

Mam już stworzoną cała maszynkę, która robi robotę i na prawdę nie chcę z tobą dyskutować na temat "błędów technologicznych".

Oczekuję precyzyjnej odpowiedzi na postawione pytanie. Twoja odpowiedź nie była ani rzeczowa, ani wnosząca cokolwiek do sprawy.

Może ty nie szukasz pomocy. Skoro mój wysiłek w analizę twojego problemu traktujesz jako atak przeciwko swojemu perfekcjonizmowi i jako "złą pomoc" to może ty w ogóle nie chcesz pomocy? Na miejscu osoby postronnej uznałbym że traktujesz w sposób chamski osobę która jak najbardziej chce ci pomóc. Sam działasz na swoją niekorzyść.

Ale to nie jest mój problem, pytania wcale nie uznałem za głupie, nie miałem zamiaru ci odpowiadać (bo i nie znam się specjalnie w tych kwestiach), gdyby nie fakt że usilnie chciałeś mnie zaczepić. Skoro moją chęć pomocy traktujesz tak jak traktujesz to twój problem. Chyba masz ze sobą jakiś problem na moim punkcie. Nie zaczepiam przypadkowych osób na forum, zaczepiam te które zadają głupie pytania. Nie zadawaj głupich pytań i nie prowokuj mnie to jest całkiem spora szansa że mnie nie uświadczysz. To taka porada na przyszłość, bo widać że masz całkiem spory problem z moją osobą. I postaraj się zapamiętać mój nick, często okazuje się to dosyć problematyczne z nieznanych mi przyczyn.

0
-123oho napisał(a):

nie miałem zamiaru ci odpowiadać (bo i nie znam się specjalnie w tych kwestiach)

-123oho napisał(a):

Na miejscu osoby postronnej uznałbym że traktujesz w sposób chamski osobę która jak najbardziej chce ci pomóc.

Zdecyduj się ... skoro niespecjalnie znasz się na tych kwestiach - jak chcesz "jak najbardziej pomóc" i przede wszystkim :

-123oho napisał(a):

Co usiłujesz osiągnąć bo póki co to mi się wydaje że złej technologii używasz do rozwiązania swojego problemu

Jak w powyższym kontekście możesz twierdzić, że używam złej technologii.

Ja nie oczekiwałem od kogokolwiek wróżbiarstwa i prostowania moich ścieżek - w sensie technologii. Oczekiwałem odpowiedzi: dlaczego following-sibling:: oraz position() nie fungują z poziomu Delphi, a zapytanie na pewno jest poprawne, bo działa np. w XMLSpy.

Masz pojęcie dlaczego ?

0
toyman napisał(a):

Masz pojęcie dlaczego ?

Pozwolisz że ciebie zignoruję, ok?

0

Ehhh. Może rano jak przeczytasz jeszcze raz na spokojnie co napisałem - podejdziesz do sprawy jak człowiek.

Tymczasem chyba jesteś zbyt zmęczony, żeby obiektywnie popatrzeć na wątek. Wyśpij się. Dobrej nocy.

0

Myślę, że mogę odpowiedziec sobie na pytanie:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms754679(v=vs.85).aspx
Chcąc używać XPath jako metody wyszukiwania - należy ustawić parametr selectionLanguage na XPath. Niestety MSXML nie obsługuje XPath 2.0, w których zdefiniowane sa funkcje concat() i following-sibling

Co prawda interface IXMLDomDocument2 ma metody obsługujące nextsibling i da się jakoś rozwiązać ten problem, ale już nie tak banalnie jak w zapytaniu XPathowym, a już na pewno nie jako banalne podzapytanie XPathowe wewnątrz innego (w "[ ]")

1 użytkowników online, w tym zalogowanych: 0, gości: 1