Damit die Suche Texte in Dateien finden kann, müssen aus diesen der textuelle Teil herausgefiltert werden. Falls notwendige Dateitypen durch den Standard nicht abgedeckt werden, können eigene Parser implementiert werden.

Vorgehensweise

Um einen eigenen Dateiparser zu entwickeln muss eine neue Klasse erstellt werden, die das Interface IAttachmentParser implementiert.

Damit ist folgende Methodensignatur vorgegeben public void Parse(AttachmentInfo attachment);

Weiterhin ist es erforderlich, dass die Klasse das Attribut AttachmentParserAttribute verwendet. Dieses bekommt als Parameter einen eindeutigen Namen, sowie eine Liste mit Dateierweiterungen, für die es anspricht. Diese Liste ist ein String, der die Dateitypen kommasepariert enthält. Als eindeutiger Name wird Namespace + Klassenname des Parsers empfohlen, andere Namen sind zulässig.

Wichtig: Parser dürfen für Attachments aus BusinessApp nur die Property TextContent verändern und ggf. InnerAttachments befüllen. Die anderen Properties werden zum Erkennen von Änderungen am ORM benutzt.

  • TextContent sollte die Wörter, die über die Suche einzeln gefunden werden sollen, per Leerzeichen getrennt enthalten. Groß- und Kleinschreibung spielt dagegen keine Rolle.
  • InnerAttachments wird benötigt, falls ein Parser für z.B. ZIP-Dateien oder andere Archivformate entwickelt wird. Für InnerAttachments werden wieder Objekte vom Typ AttachmentInfo angelegt. In diesem Fall dürfen auch andere Properties, wie z.B. FileName befüllt werden.

Auf Basis der Assembly Typen werden die Parser vorgezogen, falls für eine Dateierweiterung mehrere Parser existieren. Darüber hinaus kann diese Vorgehensweise durch die Customer.config überschrieben werden. (Siehe Doku der Customer.config).

Beispiel für die Implementierung

Soll ein eigener Excel-Parser implementiert werden, bietet sich z.B. folgender Code an:

[AttachmentParser("BA.ProjectName.AttachmentParser.ExcelParser", ".xlsx,.xlsm")]
public class ExcelParser : IAttachmentParser
{
    public void Parse(AttachmentInfo attachment)
    {
        using (MemoryStream stream = new MemoryStream(attachment.Data))
        {
            string parseResult = GetTextFromExcel(stream); // business logic for parsing the file
            attachment.TextContent = parseResult;
        }
    }
}

Falls die Datei, die geparsed werden soll, ein Container / Archiv ist, also selbst Dateien enthält, muss für die inneren Dateien jeweils wieder ein Parser aufgerufen werden.

Dies geht mit

AttachmentParserLocator.GetParser(string fileExtension).Parse(AttachmentInfo attachment)