DocumentVisitor

DocumentVisitor class

自定义文档访问者的基类。

要了解更多信息,请访问Aspose.Words 文档对象模型 (DOM)文档文章。

public abstract class DocumentVisitor

方法

姓名描述
virtual VisitAbsolutePositionTab(AbsolutePositionTab)当 a 时调用AbsolutePositionTab文档中遇到节点。
virtual VisitBodyEnd(Body)当章节中主要文本故事的枚举结束时调用。
virtual VisitBodyStart(Body)当开始枚举章节中的主要文本故事时调用。
virtual VisitBookmarkEnd(BookmarkEnd)在文档中遇到书签末尾时调用。
virtual VisitBookmarkStart(BookmarkStart)在文档中遇到书签的开头时调用。
virtual VisitBuildingBlockEnd(BuildingBlock)当构建块枚举结束时调用。
virtual VisitBuildingBlockStart(BuildingBlock)在开始枚举构建块时调用。
virtual VisitCellEnd(Cell)当表格单元格枚举结束时调用。
virtual VisitCellStart(Cell)在开始枚举表格单元格时调用。
virtual VisitCommentEnd(Comment)当注释文本枚举结束时调用。
virtual VisitCommentRangeEnd(CommentRangeEnd)当遇到注释文本范围的末尾时调用。
virtual VisitCommentRangeStart(CommentRangeStart)当遇到注释文本范围的开头时调用。
virtual VisitCommentStart(Comment)开始枚举注释文本时调用。
virtual VisitDocumentEnd(Document)文档枚举完成后调用。
virtual VisitDocumentStart(Document)在开始枚举文档时调用。
virtual VisitEditableRangeEnd(EditableRangeEnd)当文档中遇到可编辑范围的末尾时调用。
virtual VisitEditableRangeStart(EditableRangeStart)在文档中遇到可编辑范围的开头时调用。
virtual VisitFieldEnd(FieldEnd)当文档中的字段结束时调用。
virtual VisitFieldSeparator(FieldSeparator)在文档中遇到字段分隔符时调用。
virtual VisitFieldStart(FieldStart)当字段在文档中开始时调用。
virtual VisitFootnoteEnd(Footnote)当脚注或尾注文本的枚举结束时调用。
virtual VisitFootnoteStart(Footnote)开始枚举脚注或尾注文本时调用。
virtual VisitFormField(FormField)在文档中遇到表单字段时调用。
virtual VisitGlossaryDocumentEnd(GlossaryDocument)术语表文档枚举结束时调用。
virtual VisitGlossaryDocumentStart(GlossaryDocument)在词汇表文档枚举开始时调用。
virtual VisitGroupShapeEnd(GroupShape)当组形状枚举结束时调用。
virtual VisitGroupShapeStart(GroupShape)在开始枚举组形状时调用。
virtual VisitHeaderFooterEnd(HeaderFooter)当节中页眉或页脚的枚举结束时调用。
virtual VisitHeaderFooterStart(HeaderFooter)当开始枚举节中的页眉或页脚时调用。
virtual VisitOfficeMathEnd(OfficeMath)当 Office Math 对象的枚举结束时调用。
virtual VisitOfficeMathStart(OfficeMath)在开始枚举 Office Math 对象时调用。
virtual VisitParagraphEnd(Paragraph)段落枚举结束时调用。
virtual VisitParagraphStart(Paragraph)开始枚举段落时调用。
virtual VisitRowEnd(Row)当表行枚举结束时调用。
virtual VisitRowStart(Row)在开始枚举表行时调用。
virtual VisitRun(Run)当遇到文本运行时调用。
virtual VisitSectionEnd(Section)当节的枚举结束时调用。
virtual VisitSectionStart(Section)在开始枚举节时调用。
virtual VisitShapeEnd(Shape)当形状枚举结束时调用。
virtual VisitShapeStart(Shape)当开始枚举形状时调用。
virtual VisitSmartTagEnd(SmartTag)智能标记枚举结束时调用。
virtual VisitSmartTagStart(SmartTag)在开始枚举智能标记时调用。
virtual VisitSpecialChar(SpecialChar)当 a 时调用SpecialChar文档中遇到节点。
virtual VisitStructuredDocumentTagEnd(StructuredDocumentTag)当结构化文档标签的枚举结束时调用。
virtual VisitStructuredDocumentTagRangeEnd(StructuredDocumentTagRangeEnd)遇到 StructuredDocumentTagRangeEnd 时调用。
virtual VisitStructuredDocumentTagRangeStart(StructuredDocumentTagRangeStart)遇到 StructuredDocumentTagRangeStart 时调用。
virtual VisitStructuredDocumentTagStart(StructuredDocumentTag)开始枚举结构化文档标记时调用。
virtual VisitSubDocument(SubDocument)遇到子文档时调用。
virtual VisitTableEnd(Table)表枚举结束时调用。
virtual VisitTableStart(Table)在开始枚举表时调用。

评论

DocumentVisitor您可以定义并执行需要枚举文档树的自定义操作 。

例如,Aspose.Words 使用DocumentVisitor内部保存Document 各种格式以及其他操作,例如在 文档片段上查找字段或书签。

使用DocumentVisitor:

  1. 创建一个派生类DocumentVisitor
  2. 重写并提供部分或全部 VisitXXX 方法 的实现,以执行一些自定义操作。
  3. 称呼节点接受Nodethat 您想要从中开始枚举。

DocumentVisitor为所有 VisitXXX 方法 提供默认实现,以便更轻松地创建新文档访问者,因为只需要重写特定 访问者所需的方法。没有必要重写所有访问者方法。

有关详细信息,请参阅访客设计模式。

例子

演示如何使用文档访问者打印文档的节点结构。

public void DocStructureToText()
{
    Document doc = new Document(MyDir + "DocumentVisitor-compatible features.docx");
    DocStructurePrinter visitor = new DocStructurePrinter();

    // 当我们得到一个复合节点来接受文档访问者时,访问者访问接受节点,
    // 然后以深度优先的方式遍历该节点的所有子节点。
    // 访问者可以读取和修改每个访问过的节点。
    doc.Accept(visitor);

    Console.WriteLine(visitor.GetText());
}

/// <summary>
/// 遍历节点的子节点树。
/// 以字符串的形式创建该树的映射。
/// </summary>
public class DocStructurePrinter : DocumentVisitor
{
    public DocStructurePrinter()
    {
        mAcceptingNodeChildTree = new StringBuilder();
    }

    public string GetText()
    {
        return mAcceptingNodeChildTree.ToString();
    }

    /// <summary>
    /// 遇到 Document 节点时调用。
    /// </summary>
    public override VisitorAction VisitDocumentStart(Document doc)
    {
        int childNodeCount = doc.GetChildNodes(NodeType.Any, true).Count;

        IndentAndAppendLine("[Document start] Child nodes: " + childNodeCount);
        mDocTraversalDepth++;

        // 允许访问者继续访问其他节点。
        return VisitorAction.Continue;
    }

    /// <summary>
    /// 在访问 Document 节点的所有子节点后调用。
    /// </summary>
    public override VisitorAction VisitDocumentEnd(Document doc)
    {
        mDocTraversalDepth--;
        IndentAndAppendLine("[Document end]");

        return VisitorAction.Continue;
    }

    /// <summary>
    /// 在文档中遇到Section 节点时调用。
    /// </summary>
    public override VisitorAction VisitSectionStart(Section section)
    {
        // 获取文档中我们部分的索引。
        NodeCollection docSections = section.Document.GetChildNodes(NodeType.Section, false);
        int sectionIndex = docSections.IndexOf(section);

        IndentAndAppendLine("[Section start] Section index: " + sectionIndex);
        mDocTraversalDepth++;

        return VisitorAction.Continue;
    }

    /// <summary>
    /// 在访问了Section节点的所有子节点后调用。
    /// </summary>
    public override VisitorAction VisitSectionEnd(Section section)
    {
        mDocTraversalDepth--;
        IndentAndAppendLine("[Section end]");

        return VisitorAction.Continue;
    }

    /// <summary>
    /// 在文档中遇到 Body 节点时调用。
    /// </summary>
    public override VisitorAction VisitBodyStart(Body body)
    {
        int paragraphCount = body.Paragraphs.Count;
        IndentAndAppendLine("[Body start] Paragraphs: " + paragraphCount);
        mDocTraversalDepth++;

        return VisitorAction.Continue;
    }

    /// <summary>
    /// 在访问了 Body 节点的所有子节点后调用。
    /// </summary>
    public override VisitorAction VisitBodyEnd(Body body)
    {
        mDocTraversalDepth--;
        IndentAndAppendLine("[Body end]");

        return VisitorAction.Continue;
    }

    /// <summary>
    /// 在文档中遇到段落节点时调用。
    /// </summary>
    public override VisitorAction VisitParagraphStart(Paragraph paragraph)
    {
        IndentAndAppendLine("[Paragraph start]");
        mDocTraversalDepth++;

        return VisitorAction.Continue;
    }

    /// <summary>
    /// 在访问 Paragraph 节点的所有子节点后调用。
    /// </summary>
    public override VisitorAction VisitParagraphEnd(Paragraph paragraph)
    {
        mDocTraversalDepth--;
        IndentAndAppendLine("[Paragraph end]");

        return VisitorAction.Continue;
    }

    /// <summary>
    /// 在文档中遇到 Run 节点时调用。
    /// </summary>
    public override VisitorAction VisitRun(Run run)
    {
        IndentAndAppendLine("[Run] \"" + run.GetText() + "\"");

        return VisitorAction.Continue;
    }

    /// <summary>
    /// 在文档中遇到 SubDocument 节点时调用。
    /// </summary>
    public override VisitorAction VisitSubDocument(SubDocument subDocument)
    {
        IndentAndAppendLine("[SubDocument]");

        return VisitorAction.Continue;
    }

    /// <summary>
    /// 将一行追加到 StringBuilder 并根据访问者在文档树中的深度对其进行缩进。
    /// </summary>
    /// <param name="text"></param>;
    private void IndentAndAppendLine(string text)
    {
        for (int i = 0; i < mDocTraversalDepth; i++) mAcceptingNodeChildTree.Append("|  ");

        mAcceptingNodeChildTree.AppendLine(text);
    }

    private int mDocTraversalDepth;
    private readonly StringBuilder mAcceptingNodeChildTree;
}

也可以看看