Kaip naršyti OneNote dokumento DOM Python

Kaip naršyti OneNote dokumento DOM 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, tiesioginis iteravimas ir DocumentVisitor.


Dokumento objektų modelis

OneNote DOM yra griežtas medis:

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

Kiekvienas mazgas paveldi iš Node. Mazgai, turintys vaikus, paveldi iš CompositeNode.


Metodas 1: GetChildNodes (rekursinis, tipų filtruotas)

CompositeNode.GetChildNodes(Type) atlieka rekursinę giliojo pirmumo paiešką visame potvarkyje ir grąžina plokščią sąrašą visų mazgų, atitinkančių nurodytą tipą. Tai patogiausias požiūris turinio išgavimui:

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)}")

Apribokite paiešką iki vieno puslapio iškviečiant GetChildNodes ant Page vietoj 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")

Metodas 2: Tiesioginė vaikų iteracija

for child in node iteruoja tiesioginius vaikus CompositeNode. Naudokite tai, kai reikia vieno konkretaus hierarchijos lygio:

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__}")

Metodas 3: DocumentVisitor

DocumentVisitor suteikia lankytojo šabloną struktūruotam perėjimui. Perrašykite tik VisitXxxStart/End reikalingus metodus. Lankytojas yra iškviečiamas kviečiant 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())

Prieinami lankytojo metodai

Metodo poraMazgo tipas
VisitDocumentStart/EndDocument
VisitPageStart/EndPage
VisitTitleStart/EndTitle
VisitOutlineStart/EndOutline
VisitOutlineElementStart/EndOutlineElement
VisitRichTextStart/EndRichText
VisitImageStart/EndImage

Navigacija aukštyn medyje

Kiekvienas mazgas atskleidžia ParentNode ir Document savybė, leidžianti keliauti į viršų:

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

Vaikų valdymo metodai

CompositeNode taip pat atskleidžia atminties vidinį vaikų valdymą (naudinga programiškai dokumentų kūrimui, nors grąžinimas atgal į .one yra nepalaikoma):

MetodasAprašymas
node.FirstChildPirmas tiesioginis vaikas arba None
node.LastChildPaskutinis tiesioginis vaikas arba None
node.AppendChildLast(child)Pridėti vaiką pabaigoje
node.AppendChildFirst(child)Pridėti vaiką pradžioje
node.InsertChild(index, child)Įterpti pozicijoje
node.RemoveChild(child)Pašalinti vaiką

Skaičiuoti mazgus naudojant lankytoją

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}")

Tinkamo perėjimo metodo pasirinkimas

ScenarijusGeriausias požiūris
Rasti visus vienos rūšies mazgus (pvz., visus RichText)GetChildNodes(RichText)
Iteruoti tik tiesioginius vaikusfor child in node
Eiti per medį su kontekstu (gylis, tėvo būsena)DocumentVisitor
Naršyti nuo turinio iki tėvo arba šakniesnode.ParentNode / node.Document

Susiję ištekliai:

 Lietuvių