OneNote Belge DOM'unu Python içinde Nasıl Gezinilir

OneNote Belge DOM'unu Python içinde Nasıl Gezinilir

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, doğrudan yineleme ve DocumentVisitor.


Belge Nesne Modeli

OneNote DOM’u katı bir ağaçtır:

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

Her düğüm şuradan miras alır Node. Çocukları olan düğümler şuradan miras alır CompositeNode.


Yöntem 1: GetChildNodes (Yinelemeli, Tip-Filtreli)

CompositeNode.GetChildNodes(Type) tüm alt ağacın üzerinde özyinelemeli derinlik öncelikli bir arama gerçekleştirir ve verilen tipe uyan tüm düğümlerin düz bir listesini döndürür. Bu, içerik çıkarımı için en uygun yaklaşımdır:

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

Aramayı tek bir sayfaya sınırlamak için şu çağrıyı yapın GetChildNodes üzerinde Page yerine 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")

Yöntem 2: Doğrudan Çocuk Yinelemesi

for child in node şunu yineleyerek doğrudan çocukları CompositeNode. Hiyerarşinin belirli bir seviyesine ihtiyacınız olduğunda bunu kullanın:

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

Yöntem 3: DocumentVisitor

DocumentVisitor yapılandırılmış gezinme için bir ziyaretçi deseni sağlar. Yalnızca şunları geçersiz kılın VisitXxxStart/End ihtiyacınız olan yöntemleri. Ziyaretçi, şu şekilde çağrılarak gönderilir 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())

Kullanılabilir Ziyaretçi Metodları

Yöntem çiftiDüğüm türü
VisitDocumentStart/EndDocument
VisitPageStart/EndPage
VisitTitleStart/EndTitle
VisitOutlineStart/EndOutline
VisitOutlineElementStart/EndOutlineElement
VisitRichTextStart/EndRichText
VisitImageStart/EndImage

Ağacın Yukarısına Gezinme

Her düğüm şunları sunar ParentNode ve bir Document yukarı doğru gezinmek için özellik:

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

Alt Düğüm Yönetim Yöntemleri

CompositeNode aynı zamanda bellek içi alt yönetimini ortaya çıkarır (programatik belge oluşturma için faydalı, ancak geri yazma .one desteklenmiyor):

MetodAçıklama
node.FirstChildİlk doğrudan alt öğe veya None
node.LastChildSon doğrudan alt öğe veya None
node.AppendChildLast(child)Alt öğeyi sona ekle
node.AppendChildFirst(child)Alt öğeyi başa ekle
node.InsertChild(index, child)Pozisyonda ekle
node.RemoveChild(child)Bir alt öğeyi kaldır

Ziyaretçi ile Düğümleri Sayma

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

Doğru Gezinme Yöntemini Seçmek

SenaryoEn iyi yaklaşım
Bir türdeki tüm düğümleri bul (ör. tüm RichText)GetChildNodes(RichText)
Yalnızca doğrudan alt öğeleri yinelefor child in node
Ağacı bağlam (derinlik, üst durum) ile dolaşDocumentVisitor
İçerikten üst öğeye ya da köke kadar gezinnode.ParentNode / node.Document

İlgili Kaynaklar:

 Türkçe