Kā pārlūkot OneNote dokumenta DOM Python

Kā pārlūkot OneNote dokumenta 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, tieša iterācija, un DocumentVisitor.


Dokumenta objektu modelis

OneNote DOM ir stingrs koks:

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

Katrs mezgls manto no Node. Mezgli, kuriem ir bērni, manto no CompositeNode.


Metode 1: GetChildNodes (rekursīva, tipa filtrēta)

CompositeNode.GetChildNodes(Type) veic rekursīvu dziļuma pirmās meklēšanu visā apakškokā un atgriež plakanu sarakstu ar visiem mezgliem, kas atbilst norādītajam tipam. Šī ir visērtākā pieeja satura izguvei:

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

Ierobežojiet meklēšanu uz vienu lapu, izsaucot GetChildNodes uz Page nevis 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")

Metode 2: Tieša bērnu iterācija

for child in node iterē tuvāko bērnus CompositeNode. Izmantojiet šo, ja jums vajag vienu konkrētu hierarhijas līmeni:

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

Metode 3: DocumentVisitor

DocumentVisitor nodrošina apmeklētāja modeli strukturētai pārvietošanai. Pārrakstiet tikai VisitXxxStart/End metodes, kuras jums vajag. Apmeklētājs tiek izsūtīts, izsaucot 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())

Pieejamās apmeklētāja metodes

Metodes pārisMezgla tips
VisitDocumentStart/EndDocument
VisitPageStart/EndPage
VisitTitleStart/EndTitle
VisitOutlineStart/EndOutline
VisitOutlineElementStart/EndOutlineElement
VisitRichTextStart/EndRichText
VisitImageStart/EndImage

Navigācija uz augšu koka

Katrs mezgls atklāj ParentNode un Document īpašība, lai pārvietotos uz augšu:

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

Bērnu pārvaldības metodes

CompositeNode arī atklāj atmiņā esošu bērnu pārvaldību (noderīgi programmatiskai dokumenta izveidei, lai gan atgriešana uz .one nav atbalstīts):

MetodeApraksts
node.FirstChildPirmais tiešais bērns vai None
node.LastChildPēdējais tiešais bērns vai None
node.AppendChildLast(child)Pievienot bērnu beigās
node.AppendChildFirst(child)Pievienot bērnu sākumā
node.InsertChild(index, child)Ievietot pozīcijā
node.RemoveChild(child)Noņemt bērnu

Skaitīt mezglus ar apmeklētāju

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

Pareizas pārlūkošanas metodes izvēle

ScenārijsLabākā pieeja
Atrast visus mezglus viena tipa (piem., visi RichText)GetChildNodes(RichText)
Iterēt tikai tiešos bērnusfor child in node
Pārlūkot koku ar kontekstu (dziļums, vecāka stāvoklis)DocumentVisitor
Navigēt no satura uz augšu līdz vecākam vai sakneinode.ParentNode / node.Document

Saistītie resursi:

 Latviešu