איך לעבור על ה-Document DOM של OneNote ב-Python

איך לעבור על ה-Document DOM של OneNote ב-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, איטרציה ישירה, ו DocumentVisitor.


מודל האובייקטים של המסמך

ה-DOM של OneNote הוא עץ קפדני:

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

כל צומת יורש מ Node. צמתים שיש להם ילדים יורשים מ CompositeNode.


שיטה 1: GetChildNodes (רקורסיבית, מסוננת לפי סוג)

CompositeNode.GetChildNodes(Type) מבצע חיפוש רקורסיבי בעומק ראשון של כל תת-העץ ומחזיר רשימה שטוחה של כל הצמתים המתאימים לסוג הנתון. זהו הגישה הנוחה ביותר לחילוץ תוכן:

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

הגבל את החיפוש לעמוד יחיד על‑ידי קריאה ל GetChildNodes ב Page במקום 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")

שיטה 2: איטרציה ישירה של צמתים

for child in node מבצע איטרציה על מיידי הילדים של a CompositeNode. השתמש בזה כאשר אתה צריך רמה ספציפית אחת של ההיררכיה:

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

שיטה 3: DocumentVisitor

DocumentVisitor מספק תבנית מבקר (visitor) לניווט מובנה. דרוס רק את VisitXxxStart/End השיטות שאתה צריך. המבקר נשלח על ידי קריאה ל 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())

שיטות מבקר זמינות

זוג שיטותסוג צומת
VisitDocumentStart/EndDocument
VisitPageStart/EndPage
VisitTitleStart/EndTitle
VisitOutlineStart/EndOutline
VisitOutlineElementStart/EndOutlineElement
VisitRichTextStart/EndRichText
VisitImageStart/EndImage

ניווט למעלה בעץ

כל צומת חושף ParentNode ו- Document תכונה לניווט כלפי מעלה:

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

שיטות ניהול ילדים

CompositeNode גם חושף ניהול ילדים בזיכרון (שימושי לבניית מסמכים תכנותית, למרות שהכתיבה חזרה ל .one אינו נתמך):

מתודהתיאור
node.FirstChildהצאצא הישיר הראשון או None
node.LastChildהצאצא הישיר האחרון או None
node.AppendChildLast(child)הוסף צאצא בסוף
node.AppendChildFirst(child)הוסף צאצא בתחילת
node.InsertChild(index, child)הכנס במיקום
node.RemoveChild(child)הסר צאצא

ספירת צמתים בעזרת מבקר

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

בחירת שיטת הניווט הנכונה

תסריטהגישה הטובה ביותר
מצא את כל הצמתים מסוג אחד (למשל, כל RichText)GetChildNodes(RichText)
חזור על הילדים הישירים בלבדfor child in node
הלך בעץ עם הקשר (עומק, מצב הורה)DocumentVisitor
נווט מהתוכן למעלה אל ההורה או השורשnode.ParentNode / node.Document

משאבים קשורים:

 עברית