DocumentVisitor

DocumentVisitor class

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

public abstract class DocumentVisitor

方法

姓名 描述
virtual VisitAbsolutePositionTab(AbsolutePositionTab) 当一个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) 当一个SpecialChar在文档中遇到节点。
virtual VisitStructuredDocumentTagEnd(StructuredDocumentTag) 当结构化文档标签的枚举结束时调用。
virtual VisitStructuredDocumentTagRangeEnd(StructuredDocumentTagRangeEnd)
virtual VisitStructuredDocumentTagRangeStart(StructuredDocumentTagRangeStart)
virtual VisitStructuredDocumentTagStart(StructuredDocumentTag) 在结构化文档标签的枚举开始时调用。
virtual VisitSubDocument(SubDocument) 遇到子文档时调用。
virtual VisitTableEnd(Table) 在表的枚举结束时调用。
virtual VisitTableStart(Table) 在表的枚举开始时调用。

评论

文档访问者您可以定义和执行需要枚举文档树的自定义操作 。

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

使用 文档访问者

  1. 创建一个派生自的类 文档访问者.
  2. 覆盖并提供部分或全部 VisitXXX 方法 的实现以执行一些自定义操作。
  3. 称呼节点接受节点that 你想开始枚举。

文档访问者为所有 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>
    /// 在访问完一个段落节点的所有子节点后调用。
    /// </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>
    /// 在文档中遇到子文档节点时调用。
    /// </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;
}

也可以看看