Como percorrer o DOM do documento OneNote em Python

Como percorrer o DOM do documento OneNote em Python

Aspose.Note FOSS for Python represents a OneNote section file as a tree of typed Python objects. Understanding how to traverse this tree efficiently is the foundation for all content extraction tasks. This guide covers all three traversal approaches: GetChildNodes, iteração direta, e DocumentVisitor.


O Modelo de Objeto de Documento

O DOM do OneNote é uma árvore estrita:

Document
  ├── Page
  │     ├── Title
  │     │     ├── TitleText (RichText)
  │     │     ├── TitleDate (RichText)
  │     │     └── TitleTime (RichText)
  │     └── Outline
  │           └── OutlineElement
  │                 ├── RichText
  │                 ├── Image
  │                 ├── AttachedFile
  │                 └── Table
  │                       └── TableRow
  │                             └── TableCell
  │                                   └── RichText / Image
  └── Page  (next page ...)

Todo nó herda de Node. Nós que têm filhos herdam de CompositeNode.


Método 1: GetChildNodes (Recursivo, Filtrado por Tipo)

CompositeNode.GetChildNodes(Type) executa uma busca recursiva em profundidade de todo o sub‑árvore e retorna uma lista plana de todos os nós que correspondem ao tipo especificado. Esta é a abordagem mais conveniente para extração de conteúdo:

from aspose.note import Document, RichText, Image, Table, AttachedFile

doc = Document("MyNotes.one")

##All RichText nodes anywhere in the document
texts = doc.GetChildNodes(RichText)
print(f"RichText nodes: {len(texts)}")

##All images
images = doc.GetChildNodes(Image)
print(f"Image nodes: {len(images)}")

##All tables
tables = doc.GetChildNodes(Table)
print(f"Table nodes: {len(tables)}")

##All attachments
attachments = doc.GetChildNodes(AttachedFile)
print(f"AttachedFile nodes: {len(attachments)}")

Limite a busca a uma única página chamando GetChildNodes em Page em vez de Document:

from aspose.note import Document, Page, RichText

doc = Document("MyNotes.one")
for page in doc.GetChildNodes(Page):
    page_texts = page.GetChildNodes(RichText)
    print(f"  Page has {len(page_texts)} text nodes")

Método 2: Iteração Direta de Filhos

for child in node itera o imediato filhos de um CompositeNode. Use isso quando precisar de um nível específico da hierarquia:

from aspose.note import Document

doc = Document("MyNotes.one")

##Direct children of Document are Pages
for page in doc:
    title = (
        page.Title.TitleText.Text
        if page.Title and page.Title.TitleText
        else "(untitled)"
    )
    print(f"Page: {title}")
    # Direct children of Page are Outlines (and optionally Title)
    for child in page:
        print(f"  {type(child).__name__}")

Método 3: DocumentVisitor

DocumentVisitor fornece um padrão visitor para travessia estruturada. Sobrescreva apenas o VisitXxxStart/End métodos que você precisa. O visitor é despachado ao chamar doc.Accept(visitor):

from aspose.note import (
    Document, DocumentVisitor, Page, Title,
    Outline, OutlineElement, RichText, Image,
)

class StructurePrinter(DocumentVisitor):
    def __init__(self):
        self._depth = 0

    def _indent(self):
        return "  " * self._depth

    def VisitPageStart(self, page: Page) -> None:
        t = page.Title.TitleText.Text if page.Title and page.Title.TitleText else "(untitled)"
        print(f"{self._indent()}Page: {t!r}")
        self._depth += 1

    def VisitPageEnd(self, page: Page) -> None:
        self._depth -= 1

    def VisitOutlineStart(self, outline) -> None:
        self._depth += 1

    def VisitOutlineEnd(self, outline) -> None:
        self._depth -= 1

    def VisitRichTextStart(self, rt: RichText) -> None:
        if rt.Text.strip():
            print(f"{self._indent()}Text: {rt.Text.strip()!r}")

    def VisitImageStart(self, img: Image) -> None:
        print(f"{self._indent()}Image: {img.FileName!r} ({img.Width}x{img.Height}pts)")

doc = Document("MyNotes.one")
doc.Accept(StructurePrinter())

Métodos Visitor Disponíveis

Par de métodosTipo de nó
VisitDocumentStart/EndDocument
VisitPageStart/EndPage
VisitTitleStart/EndTitle
VisitOutlineStart/EndOutline
VisitOutlineElementStart/EndOutlineElement
VisitRichTextStart/EndRichText
VisitImageStart/EndImage

Navegando para cima na árvore

Cada nó expõe ParentNode e um Document propriedade para navegar para cima:

from aspose.note import Document, RichText

doc = Document("MyNotes.one")
for rt in doc.GetChildNodes(RichText):
    parent = rt.ParentNode   # OutlineElement, TableCell, Title, etc.
    root = rt.Document       # always the Document root
    print(f"  '{rt.Text.strip()!r}' parent={type(parent).__name__}")
    break

Métodos de Gerenciamento de Filhos

CompositeNode também expõe gerenciamento de filhos em memória (útil para construção programática de documentos, embora write-back para .one não é suportado):

MétodoDescrição
node.FirstChildPrimeiro filho direto ou None
node.LastChildÚltimo filho direto ou None
node.AppendChildLast(child)Adicionar filho ao final
node.AppendChildFirst(child)Adicionar filho ao início
node.InsertChild(index, child)Inserir na posição
node.RemoveChild(child)Remover um filho

Contar Nós com um Visitor

from aspose.note import Document, DocumentVisitor, Page, RichText, Image

class Counter(DocumentVisitor):
    def __init__(self):
        self.pages = self.texts = self.images = 0

    def VisitPageStart(self, page: Page) -> None:
        self.pages += 1

    def VisitRichTextStart(self, rt: RichText) -> None:
        self.texts += 1

    def VisitImageStart(self, img: Image) -> None:
        self.images += 1

doc = Document("MyNotes.one")
c = Counter()
doc.Accept(c)
print(f"Pages={c.pages}  RichText={c.texts}  Images={c.images}")

Escolhendo o Método de Traversal Correto

CenárioMelhor abordagem
Encontrar todos os nós de um tipo (ex.: todos RichText)GetChildNodes(RichText)
Iterar apenas filhos diretosfor child in node
Percorrer a árvore com contexto (profundidade, estado do pai)DocumentVisitor
Navegue do conteúdo até o pai ou raiznode.ParentNode / node.Document

Recursos Relacionados:

 Português