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 使用 文档访问者内部保存 文档 以各种格式和其他操作,例如在 文档片段上查找字段或书签。
使用 文档访问者:
- 创建一个派生自的类 文档访问者.
- 覆盖并提供部分或全部 VisitXXX 方法 的实现以执行一些自定义操作。
- 称呼
节点接受
在 节点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;
}
也可以看看
- 命名空间 Aspose.Words
- 部件 Aspose.Words