Seite 1 von 2

Problem mit createReplaceDescriptor

Verfasst: So, 20.06.2010 17:33
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

Re: Problem mit createReplaceDescriptor

Verfasst: So, 20.06.2010 17:45
von komma4
Teste den Code nicht bei laufender IDE - rufe aus dem Dokument raus auf.

Re: Problem mit createReplaceDescriptor

Verfasst: So, 20.06.2010 17:52
von marcel_at_work
Hey Winfried,

... geht leider auch nicht. :(

lg

Re: Problem mit createReplaceDescriptor

Verfasst: So, 20.06.2010 17:59
von komma4
Stimmt, daran kanns nicht liegen - funktioniert auch in der IDE einwandfrei hier.


Neustart OOo

Re: Problem mit createReplaceDescriptor

Verfasst: So, 20.06.2010 18:05
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

Re: Problem mit createReplaceDescriptor

Verfasst: So, 20.06.2010 18:31
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

Re: Problem mit createReplaceDescriptor

Verfasst: So, 20.06.2010 19:08
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)

Re: Problem mit createReplaceDescriptor

Verfasst: So, 20.06.2010 19:32
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

Re: Problem mit createReplaceDescriptor

Verfasst: So, 20.06.2010 19:52
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

Re: Problem mit createReplaceDescriptor

Verfasst: So, 20.06.2010 20:05
von marcel_at_work
Dank dir. ;-)

Lg, Marci

Re: Problem mit createReplaceDescriptor

Verfasst: So, 20.06.2010 20:36
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

Re: Problem mit createReplaceDescriptor

Verfasst: So, 20.06.2010 21:53
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

Re: Problem mit createReplaceDescriptor

Verfasst: So, 20.06.2010 22:12
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... :(

Re: Problem mit createReplaceDescriptor

Verfasst: Mo, 21.06.2010 18:14
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.

Re: Problem mit createReplaceDescriptor

Verfasst: Mo, 21.06.2010 22:18
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