Problem mit createReplaceDescriptor

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Problem mit createReplaceDescriptor

Beitrag von marcel_at_work »

Hallo Freunde,

ich hab letztens das Grundgerüst für eine Suchmaschine angefangen und diese läuft soweit ganz gut. Nun will ich aber zwecks der Verwendung von "regulären Ausdrücken" gern meine Instr-Funktionen auf den ReplaceDescriptor umbauen, wobei mir OOo aber eine Fehlermeldung ausgibt - obwohl ich das Beispiel aus dem Handbuch 1:1 übernommen habe:

Code: Alles auswählen

...
ReplaceDescriptor = thisComponent.createReplaceDescriptor
ReplaceDescriptor.SearchRegularExpression = True
ReplaceDescriptor.SearchString = "^$"
...
OOo erkennt die Methode create... nicht. Hat jemand einen Rat???

Lg, Marci
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Problem mit createReplaceDescriptor

Beitrag von komma4 »

Teste den Code nicht bei laufender IDE - rufe aus dem Dokument raus auf.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Problem mit createReplaceDescriptor

Beitrag von marcel_at_work »

Hey Winfried,

... geht leider auch nicht. :(

lg
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Problem mit createReplaceDescriptor

Beitrag von komma4 »

Stimmt, daran kanns nicht liegen - funktioniert auch in der IDE einwandfrei hier.


Neustart OOo
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Problem mit createReplaceDescriptor

Beitrag von turtle47 »

Hallo marcel_at_work,

wenn Du in einer Calc-Datei suchst, so musst Du auf dem Sheet suchen lassen und nicht im Dokument.

Code: Alles auswählen

oSheet = thisComponent.sheets().getbyName("Tabelle1")
oErsetzen = oSheet.createReplaceDescriptor()

Gruss.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Problem mit createReplaceDescriptor

Beitrag von marcel_at_work »

Hey, ihr zwei,

... hm... Neustart?

Der Descriptor funzt über das Sheet 1a, ist aber leider nicht das wa ich brauche (ich suche NICHT in der Tabelle).

Das Frontier meiner Suchmaschine ist ein Webcrawler, mit dem ich den Inhalt einer URL in ein String-Objekt lade. Und nun möchte ich eben irgendwie mit dem Descriptor auf dieses String-Objekt zugreifen, da meine bisherige Funktion, um die Meta-Angaben zu parsen, schon recht umständlich ist. In der Dokumentation steht, dass dieser sich auf "Dokument-Objekte" bezieht, weshalb ich den Fehler nicht verstehe:

Code: Alles auswählen

Sub webLoading()
	Dim iNumber As Integer
	Dim sTextzeile As String
	iNumber = Freefile
	Open sWebUrl For Input As iNumber
	While NOT eof(iNumber)
	   Line Input #iNumber, sTextzeile
	   If sTextzeile <> "" Then
	      sQuelltext = sQuelltext & sTextzeile & Chr(13)
	   End If
	Wend
	Close #iNumber
	
	Dim replaceDescriptor As Object
	replaceDescriptor = ThisComponent.CreateReplaceDescriptor '< FEHLER
	replaceDescriptor.SearchRegularExpression = True
	replaceDescriptor.SearchString = "^$"
        ...
	
	call webParsing()
End Sub
Wie könnt ich das denn anstellen, dass man den Descriptor direkt in dem String anwenden kann?

Lg, Marci
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Problem mit createReplaceDescriptor

Beitrag von komma4 »

marcel_at_work hat geschrieben:Wie könnt ich das denn anstellen, dass man den Descriptor direkt in dem String anwenden kann?
Der DESCRIPTOR funktioniert nur mit Dokumenten.

Erstelle ein leeres WRITER und setze den String da rein - dann geht's.


Ansonsten meinen Rat: die Fragestellung bitte so umfassend stellen, dass die Antworten auch passen können.
Jürgens Tipp (sheet) erzeugt Dir einen Descriptor, den kannst Du bei einer Stringuntersuchung aber gar nicht verwenden...
Das konnte meine Glaskugel alles nicht zeigen 8)
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Problem mit createReplaceDescriptor

Beitrag von marcel_at_work »

;-)

Jepp, da hast du Recht. Werd´ich mir merken.

Hmmm... das mit dem Writer-Dokument klingt als ne gute Sache. Ich werd´des jetzt auch so lösen. Ich hab grad noch nachgedacht, den String in ein verborgenes Tabellen-Sheet zu laden, aber soweit ich das grad aus der Doku verstanden habe, kann man den Descriptor ausschließlich auf ganze Zellen anwenden, wobei dies mir dann wirklich nicht sehr weit helfen würde.

Wie würdet ihr es denn anstellen, ein textbasiertes Dokument aus dem Web zu laden und zu analysieren? Ist meine Variante dann im Vergleich eher sehr zeitaufwändig?

Lg, Marci
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Problem mit createReplaceDescriptor

Beitrag von komma4 »

neues Writer-Dokument > insertDocumentFromURL() > SearchDescriptor

geht auch im Hintergrund (DocumentProperties: HIDDEN) und dann wegwerfen, wenn Du es nicht mehr brauchst.

Mit den Suchbegriffen solltest Du hier im Forum Codebeispiele finden
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Problem mit createReplaceDescriptor

Beitrag von marcel_at_work »

Dank dir. ;-)

Lg, Marci
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Problem mit createReplaceDescriptor

Beitrag von marcel_at_work »

Hmmm...... schön und gut, dass man Dokumente somit auch direkt öffnen kann, aber da gibt´s a kleines Problem: Ich hab mal versuchsweise meine eigene Homepage (.../index.html) geöffnet und die insertDocumentFromURL-Methode hat mir doch glatt genau DAS in das Writer-Dokument geladen, was man auch "online" zuerst sehen sollte (meine Website besteht aus einem einzigen Flashfilm und dieser ist auch das einzige, was ich nun in Writer sehen kann).

Was hat es denn damit auf sich? WO ist der Quelltext? Hab ich noch etwas wichtiges vergessen?

Lg, Marci
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Problem mit createReplaceDescriptor

Beitrag von marcel_at_work »

Hey Winfried, ich bin´s nochmal... ;-)

... ich hab das jetzt mit insertDocumentFromURL gelassen und bin bei der Textzeilen-Implementierung geblieben, da es so zumindest funktioniert.

Ich habe jetzt den Descriptor eingebunden und auch dieser klappt soweit einwandfrei. Ich habe nur das Problem, das ich auch nach längerem Herumsuchen nichts gefunden habe, um auf das Ergebnis zugreifen zu können. Ich habe auch diese "Füllwortliste" von dir zu Rate gezogen, aber dennoch finde ich nicht den richtigen Ansatz: bis auf den Count des Such-Ergebnisses, komme ich leider nicht weiter...

Code: Alles auswählen

...
Dim SearchDesc As Object
Dim FoundDesc
SearchDesc = oTempQuelltext.createSearchDescriptor
SearchDesc.SearchRegularExpression = True
SearchDesc.SearchCaseSensitive = False
SearchDesc.SearchString = "<title>" & ".*" & "</title>"

GlobalScope.BasicLibraries.LoadLibrary("XrayTool")

FoundDesc = oTempQuelltext.findAll(SearchDesc)

xray FoundDesc

msgbox FoundDesc.hasElements
msgbox FoundDesc.getCount()
...
Ich möchte halt irgendwie an die Ergebnismenge (den Inhalt des Meta-Tags "title") von FoundDesc... PLEASE HELP ME......... :(

Lg, Marci
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Problem mit createReplaceDescriptor

Beitrag von marcel_at_work »

... upps.......................

"Xray ist dein Freund". ;-)

Es war ".String", einfach nur ".String". ;-) Also, wenn man Xray ein paar Mal verwendet hat, kommt man auch langsam hinter dessen Funktionsweise - wie geil. :lol:

Beste Grüße an die Kollegen...

Lg, Marci

EDIT:

Hat jemand zufällig eine Ahnung, wie man mit den regulären Ausdrücken über mehrere Zeilen suchen kann??? Irgendwie will der bei mir nur über EINE suchen, selbst, wenn ich ausdrücklich einen möglichen Zeilenumbruch angebe.

Code: Alles auswählen

SearchDesc.SearchString = "<body" & ".*" & "\n*" & ".*" & ">"
Da kommt bei mir ein leeres Objekt zurück... :(
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Problem mit createReplaceDescriptor

Beitrag von DPunch »

Aloha
marcel_at_work hat geschrieben:Irgendwie will der bei mir nur über EINE suchen, selbst, wenn ich ausdrücklich einen möglichen Zeilenumbruch angebe.
Deine Zeilenumbrüche sind für den SearchDescriptor keine Newlines, sondern Paragraph Marks (Chr(13)).

(Newlines: bei Writer z.B. per Shift+Enter, Paragraph Marks: bei Writer per Enter)
Die Suchroutine von OOo sucht aber jeden Paragraph einzeln ab - sprich: ist der Text durch Paragraph Marks getrennt, wird er nur genau bis zu dieser Marke hinsichtlich der Suchergebnisse analysiert.
Du brauchst also Newlines, die der SearchDescriptor auch als solche erkennt:

Code: Alles auswählen

   While NOT eof(iNumber)
      Line Input #iNumber, sTextzeile
      If sTextzeile <> "" Then
         sQuelltext = sQuelltext & sTextzeile & Chr(10) '############ <--- statt Chr(13)
      End If
   Wend
Danach solltest Du mit \n auch die Zeilenumbrüche erwischen und z.B. so:
SearchDesc.SearchString = "<body[^>]*>"
auch über mehrere Zeilen gehende Ergebnisse erhalten, die zwischen "<body" und dem ersten abschliessenden ">" stehen.
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Problem mit createReplaceDescriptor

Beitrag von marcel_at_work »

Hallo DPunch,

... mein großer Held. Schön, mal wieder ein Lebenszeichen von dir zu hören. :lol:

Supi... funzt einwandfrei! DANKE!!!

Zwar ging deine Zuweisung nicht, da man beim Suchen anscheinend trotzalledem den Ausdruck "\n" für einen Zeilenumbruch verwenden muß, aber nach einigem hin und her akzeptiert er meinen Wunsch nun über die Benutzung von zwei Referenzen:

SearchDesc.SearchString = "<body.*((\n)*|.*)*.*body>"

... aber mal im Ernst, auf sowas Verwirrendes: ((\n)*|.*)* ... muß man erstmal kommen!? :lol:

Es geht, nun steht dem Aufbau meiner eigenen Google-Krake nichts mehr im Wege! :lol: :lol: :lol:

Liebe Grüße an ALLE

Marci
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Antworten