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

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.
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.
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!?
Es geht, nun steht dem Aufbau meiner eigenen Google-Krake nichts mehr im Wege!
Liebe Grüße an ALLE
Marci