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>
    /// 在文档中遇到文档节点时调用。
    /// </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>
    /// 当页面节点的处理完成时调用。
    /// </summary>
    public override void VisitPageEnd(Page page)
    {
        this.AppendText(string.Empty);
    }

    /// <summary>
    /// 在文档中遇到标题节点时调用。
    /// </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>
    /// 在文档中遇到大纲节点时调用。
    /// </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;
}

也可以看看