Accept
Innehåll
[
Dölj
]Row.Accept method
Accepterar en besökare.
public override bool Accept(DocumentVisitor visitor)
Parameter | Typ | Beskrivning |
---|---|---|
visitor | DocumentVisitor | Besökaren som kommer att besöka noderna. |
Returvärde
Sant om alla noder besöktes; falskt omDocumentVisitor
stoppade operationen innan du besökte alla noder.
Anmärkningar
Räknar upp denna nod och alla dess barn. Varje nod anropar en motsvarande metodDocumentVisitor
.
För mer information se Visitor design mönster.
SamtalVisitRowStart
, sedan ringerAccept
för alla underordnade noder i avsnittet och anropVisitRowEnd
i slutet.
Exempel
Visar hur man skriver ut nodstrukturen för varje tabell i ett dokument.
public void TableToText()
{
Document doc = new Document(MyDir + "DocumentVisitor-compatible features.docx");
TableStructurePrinter visitor = new TableStructurePrinter();
// När vi får en sammansatt nod att acceptera en dokumentbesökare, besöker besökaren den accepterande noden,
// och sedan korsar alla nodens barn på ett djup-först sätt.
// Besökaren kan läsa och ändra varje besökt nod.
doc.Accept(visitor);
Console.WriteLine(visitor.GetText());
}
/// <summary>
/// Går igenom en nods icke-binära träd av underordnade noder.
/// Skapar en karta i form av en sträng av alla påträffade tabellnoder och deras barn.
/// </summary>
public class TableStructurePrinter : DocumentVisitor
{
public TableStructurePrinter()
{
mVisitedTables = new StringBuilder();
mVisitorIsInsideTable = false;
}
public string GetText()
{
return mVisitedTables.ToString();
}
/// <summary>
/// Anropas när en körnod påträffas i dokumentet.
/// Körningar som inte finns i tabeller registreras inte.
/// </summary>
public override VisitorAction VisitRun(Run run)
{
if (mVisitorIsInsideTable) IndentAndAppendLine("[Run] \"" + run.GetText() + "\"");
return VisitorAction.Continue;
}
/// <summary>
/// Anropas när en tabell påträffas i dokumentet.
/// </summary>
public override VisitorAction VisitTableStart(Table table)
{
int rows = 0;
int columns = 0;
if (table.Rows.Count > 0)
{
rows = table.Rows.Count;
columns = table.FirstRow.Count;
}
IndentAndAppendLine("[Table start] Size: " + rows + "x" + columns);
mDocTraversalDepth++;
mVisitorIsInsideTable = true;
return VisitorAction.Continue;
}
/// <summary>
/// Kallas efter att alla undernoder i en tabellnod har besökts.
/// </summary>
public override VisitorAction VisitTableEnd(Table table)
{
mDocTraversalDepth--;
IndentAndAppendLine("[Table end]");
mVisitorIsInsideTable = false;
return VisitorAction.Continue;
}
/// <summary>
/// Anropas när en radnod påträffas i dokumentet.
/// </summary>
public override VisitorAction VisitRowStart(Row row)
{
string rowContents = row.GetText().TrimEnd(new []{ '\u0007', ' ' }).Replace("\u0007", ", ");
int rowWidth = row.IndexOf(row.LastCell) + 1;
int rowIndex = row.ParentTable.IndexOf(row);
string rowStatusInTable = row.IsFirstRow && row.IsLastRow ? "only" : row.IsFirstRow ? "first" : row.IsLastRow ? "last" : "";
if (rowStatusInTable != "")
{
rowStatusInTable = $", the {rowStatusInTable} row in this table,";
}
IndentAndAppendLine($"[Row start] Row #{++rowIndex}{rowStatusInTable} width {rowWidth}, \"{rowContents}\"");
mDocTraversalDepth++;
return VisitorAction.Continue;
}
/// <summary>
/// Anropas efter att alla undernoder i en radnod har besökts.
/// </summary>
public override VisitorAction VisitRowEnd(Row row)
{
mDocTraversalDepth--;
IndentAndAppendLine("[Row end]");
return VisitorAction.Continue;
}
/// <summary>
/// Anropas när en cellnod påträffas i dokumentet.
/// </summary>
public override VisitorAction VisitCellStart(Cell cell)
{
Row row = cell.ParentRow;
Table table = row.ParentTable;
string cellStatusInRow = cell.IsFirstCell && cell.IsLastCell ? "only" : cell.IsFirstCell ? "first" : cell.IsLastCell ? "last" : "";
if (cellStatusInRow != "")
{
cellStatusInRow = $", the {cellStatusInRow} cell in this row";
}
IndentAndAppendLine($"[Cell start] Row {table.IndexOf(row) + 1}, Col {row.IndexOf(cell) + 1}{cellStatusInRow}");
mDocTraversalDepth++;
return VisitorAction.Continue;
}
/// <summary>
/// Anropas efter att alla undernoder i en cellnod har besökts.
/// </summary>
public override VisitorAction VisitCellEnd(Cell cell)
{
mDocTraversalDepth--;
IndentAndAppendLine("[Cell end]");
return VisitorAction.Continue;
}
/// <summary>
/// Lägg till en rad i StringBuilder och dra in den beroende på hur djup besökaren är
/// i den aktuella tabellens träd med underordnade noder.
/// </summary>
/// <param name="text"></param>
private void IndentAndAppendLine(string text)
{
for (int i = 0; i < mDocTraversalDepth; i++)
{
mVisitedTables.Append("| ");
}
mVisitedTables.AppendLine(text);
}
private bool mVisitorIsInsideTable;
private int mDocTraversalDepth;
private readonly StringBuilder mVisitedTables;
}
Se även
- class DocumentVisitor
- class Row
- namnutrymme Aspose.Words.Tables
- hopsättning Aspose.Words