Class DocumentVisitor

DocumentVisitor class

Абстрактный класс для итерации по поддереву с корнем в указанном узле.

public abstract class DocumentVisitor

Методы

ИмяОписание
virtual VisitAttachedFileEnd(AttachedFile)Конец посещенияAttachedFile узел.
virtual VisitAttachedFileStart(AttachedFile)Начните посещатьAttachedFile узел.
virtual VisitDocumentEnd(Document)Конец посещенияDocument узел.
virtual VisitDocumentStart(Document)Начните посещатьDocument узел.
virtual VisitImageEnd(Image)Конец посещенияImage узел.
virtual VisitImageStart(Image)Начните посещатьImage узел.
virtual VisitOutlineElementEnd(OutlineElement)Конец посещенияOutlineElement узел.
virtual VisitOutlineElementStart(OutlineElement)Начните посещатьOutlineElement узел.
virtual VisitOutlineEnd(Outline)Конец посещенияOutline узел.
virtual VisitOutlineGroupEnd(OutlineGroup)Конец посещенияOutlineGroup узел.
virtual VisitOutlineGroupStart(OutlineGroup)Начните посещатьOutlineGroup узел.
virtual VisitOutlineStart(Outline)Начните посещатьOutline узел.
virtual VisitPageEnd(Page)Конец посещенияPage узел.
virtual VisitPageStart(Page)Начните посещатьPage узел.
virtual VisitRichTextEnd(RichText)Конец посещенияRichText узел.
virtual VisitRichTextStart(RichText)Начните посещатьRichText узел.
virtual VisitTableCellEnd(TableCell)Конец посещенияTableCell узел.
virtual VisitTableCellStart(TableCell)Начните посещатьTableCell узел.
virtual VisitTableEnd(Table)Конец посещенияTable узел.
virtual VisitTableRowEnd(TableRow)Конец посещенияTableRow узел.
virtual VisitTableRowStart(TableRow)Начните посещатьTableRow узел.
virtual VisitTableStart(Table)Начните посещатьTable узел.
virtual VisitTitleEnd(Title)Конец посещенияTitle узел.
virtual VisitTitleStart(Title)Начните посещатьTitle узел.

Примеры

Показывает, как получить доступ к содержимому документа с помощью посетителя.

public static void Run()
{
    // Путь к каталогу документов.
    string dataDir = RunExamples.GetDataDir_LoadingAndSaving();

    // Откройте документ, который мы хотим преобразовать.
    Document doc = new Document(dataDir + "Aspose.one");

    // Создаем объект, наследуемый от класса DocumentVisitor.
    MyOneNoteToTxtWriter myConverter = new MyOneNoteToTxtWriter();

    // Это хорошо известный шаблон Посетитель. Заставьте модель принять посетителя.
    // Модель будет перебирать сама себя, вызывая соответствующие методы
    // на объекте посетителя (это называется посещением).
    //
    // Обратите внимание, что каждый узел в объектной модели имеет метод Accept, поэтому посещение
    // может выполняться не только для всего документа, но и для любого узла в документе.
    doc.Accept(myConverter);

    // После завершения посещения мы можем получить результат операции,
    // что в этом примере накопилось у посетителя.
    Console.WriteLine(myConverter.GetText());
    Console.WriteLine(myConverter.NodeCount);            
}

/// <summary>
/// Простая реализация сохранения документа в текстовом формате. Реализовано как посетитель.
/// </summary>
public class MyOneNoteToTxtWriter : DocumentVisitor
{
    public MyOneNoteToTxtWriter()
    {
        nodecount = 0;
        mIsSkipText = false;
        mBuilder = new StringBuilder();
    }

    /// <summary>
    /// Получает обычный текст документа, который накопил посетитель.
    /// </summary>
    public string GetText()
    {
        return mBuilder.ToString();
    }

    /// <summary>
    /// Добавляет текст к текущему выводу. Учитывает включенный/отключенный выходной флаг.
    /// </summary>
    private void AppendText(string text)
    {
        if (!mIsSkipText)
        {
            mBuilder.AppendLine(text);
        }
    }

    /// <summary>
    /// Вызывается, когда в документе встречается узел RichText.
    /// </summary>
    public override void VisitRichTextStart(RichText run)
    {
        ++nodecount;
        AppendText(run.Text);
    }

    /// <summary>
    /// Вызывается, когда в документе встречается узел Document.
    /// </summary>
    public override void VisitDocumentStart(Document document)
    {
        ++nodecount;
    }

    /// <summary>
    /// Вызывается, когда в документе встречается узел страницы.
    /// </summary>
    public override void VisitPageStart(Page page)
    {
        ++nodecount;
        this.AppendText($"*** Page '{page.Title?.TitleText?.Text ?? "(no title)"}' ***");
    }

    /// <summary>
    /// Вызывается, когда обработка узла Page завершена.
    /// </summary>
    public override void VisitPageEnd(Page page)
    {
        this.AppendText(string.Empty);
    }

    /// <summary>
    /// Вызывается, когда в документе встречается узел Title.
    /// </summary>
    public override void VisitTitleStart(Title title)
    {
        ++nodecount;
    }

    /// <summary>
    /// Вызывается, когда в документе встречается узел изображения.
    /// </summary>
    public override void VisitImageStart(Image image)
    {
        ++nodecount;
    }

    /// <summary>
    /// Вызывается, когда в документе встречается узел OutlineGroup.
    /// </summary>
    public override void VisitOutlineGroupStart(OutlineGroup outlineGroup)
    {
        ++nodecount;
    }

    /// <summary>
    /// Вызывается, когда в документе встречается узел Outline.
    /// </summary>
    public override void VisitOutlineStart(Outline outline)
    {
        ++nodecount;
    }

    /// <summary>
    /// Вызывается, когда в документе встречается узел OutlineElement.
    /// </summary>
    public override void VisitOutlineElementStart(OutlineElement outlineElement)
    {
        ++nodecount;
    }

    /// <summary>
    /// Получает общее количество узлов посетителя
    /// </summary>
    public Int32 NodeCount
    {
        get { return this.nodecount; }
    }

    private readonly StringBuilder mBuilder;
    private bool mIsSkipText;
    private Int32 nodecount;
}

Смотрите также