Kuinka kulkea OneNote-dokumentin DOM:ia Python:ssa

Kuinka kulkea OneNote-dokumentin DOM:ia Python:ssa

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, suora iteraatio, ja DocumentVisitor.


Dokumentin objektimalli

OneNote DOM on tiukka puu:

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

Jokainen solmu perii Node. Solmut, joilla on lapsia, perivät CompositeNode.


Menetelmä 1: GetChildNodes (rekursiivinen, tyyppisuodatettu)

CompositeNode.GetChildNodes(Type) suorittaa rekursiivisen syvyyssuuntaisen haun koko alipuusta ja palauttaa tasaisen listan kaikista annetun tyypin mukaisista solmuista. Tämä on kävin lähestymistapa sisällön poimintaan:

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

Rajaa haku yhdelle sivulle kutsumalla GetChildNodes on Page sen sijaan 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")

Menetelmä 2: Suora lapsisolmujen iteraatio

for child in node iteraatio välitön lapsia CompositeNode. Käytä tätä, kun tarvitset yhden tietyn tason hierarkiassa:

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

Menetelmä 3: DocumentVisitor

DocumentVisitor tarjoaa vierailijamallin rakenteelliseen läpikäyntiin. Ylikirjoita vain VisitXxxStart/End tarvitsemiasi metodeja. Vierailija kutsutaan kutsumalla 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())

Käytettävissä olevat vierailijametodit

MetodipariSolmutyyppi
VisitDocumentStart/EndDocument
VisitPageStart/EndPage
VisitTitleStart/EndTitle
VisitOutlineStart/EndOutline
VisitOutlineElementStart/EndOutlineElement
VisitRichTextStart/EndRichText
VisitImageStart/EndImage

Navigointi puun yläosaan

Jokainen solmu paljastaa ParentNode ja Document ominaisuus navigoida ylöspäin:

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

Alisolmujen Hallintamenetelmät

CompositeNode myös paljastaa muistin sisäisen alikohteiden hallinnan (hyödyllinen ohjelmalliseen asiakirjarakentamiseen, vaikka kirjoittaminen takaisin kohteeseen .one ei ole tuettu):

MetodiKuvaus
node.FirstChildEnsimmäinen suora lapsi tai None
node.LastChildViimeinen suora lapsi tai None
node.AppendChildLast(child)Lisää lapsi loppuun
node.AppendChildFirst(child)Lisää lapsi alkuun
node.InsertChild(index, child)Lisää kohtaan
node.RemoveChild(child)Poista lapsi

Laske Solmut Vierailijalla

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

Oikean Läpikäyntimenetelmän Valinta

SkenaarioParas lähestymistapa
Etsi kaikki solmut, jotka ovat yhtä tyyppiä (esim. kaikki RichText)GetChildNodes(RichText)
Iteroi vain suorat lapsetfor child in node
Käy puu läpi kontekstilla (syvyys, vanhemman tila)DocumentVisitor
Navigoi sisällöstä ylöspäin vanhempaan tai juureennode.ParentNode / node.Document

Aiheeseen liittyvät resurssit:

 Suomi