Nodes ile .NET'de Nasıl Çalışılır

Nodes ile .NET'de Nasıl Çalışılır

Bu kılavuz, bir Word belgesinin düğüm ağacında doğrudan gezinmeyi, sorgulamayı ve değiştirmeyi gösterir Aspose.Words FOSS için .NET, kullanarak Node and CompositeNode temel sınıflar ki Document, Section, Paragraph, Table, ve diğer tüm belge öğeleri üzerine inşa edilmiştir. Bir aramayı kapsamlandırmayı kapsar NodeType, düğümleri programlı olarak ekleme ve kaldırma, yapısal değişikliklere yanıt verme ve kullanma DocumentVisitor tür-gönderimli dolaşım için.

Adım Adım Kılavuz

Adım 1: Paketi Yükleyin

Aspose.Words FOSS for .NET henüz bir NuGet paketi yayınlamıyor – bunun yerine kütüphaneyi kaynak koddan derleyin. https://github.com/aspose-words-foss/Aspose.Words-FOSS-for-.NET.git deposunu klonlayın, ardından Aspose.Words.sln projesini .NET SDK’sı ile Release yapılandırmasında derleyin ve ortaya çıkan Aspose.Words derlemesini projenize referans verin. Kütüphane .NET Standard 2.0 hedefli olduğundan, .NET Framework 4.6.2+ ve .NET 6/8/10 üzerinde çalışır.


Adım 2: Gerekli Sınıfları İçe Aktarın

Bir using Aspose.Words; yönergesi ekleyin – Node, CompositeNode, NodeType, NodeCollection, NodeList, INodeChangingCallback ve DocumentVisitor hepsi Aspose.Words ad alanında Document ile birlikte bulunur.


Adım 3: Düğümü ve CompositeNode Temel Sınıflarını Anlayın

Belge ağacındaki her nesne, Node soyut sınıfından türetilir; bu sınıf NodeType (düğümün ne tür bir olduğunu belirten), ParentNode (CompositeNode‘ı kapsayan), Document (sahip olduğu belge) ve aynı seviyedeki düğümler arasında geçiş için PreviousSibling / NextSibling öğelerini ortaya çıkarır. Node.IsComposite‘i kontrol ederek bir düğümün çocuk içerip içermediğini öğrenin, ardından dönüştürme yapın. CompositeNode, konteyner öğeleri için Node‘i genişletir — FirstChild, LastChild ve Count doğrudan çocuklarını tanımlar ve HasChildNodes herhangi birinin olup olmadığını rapor eder.


Adım 4: Çocukları Türlerine Göre Sorgula

CompositeNode.GetChildNodes(nodeType, isDeep)‘ı çağırarak belirli bir NodeType‘in tüm çocuklarını alabilirsiniz; yalnızca doğrudan çocukları değil tüm alt ağacı aramak için isDeep: true‘yi, türüne bakılmaksızın her düğüm tipini eşleştirmek için NodeType.Any‘ü geçirin. CompositeNode.GetChild(nodeType, index, isDeep), indekse göre tek bir eşleşen çocuğu getirir. Yapısal düğüm tipleri (Document, Section, Body, Paragraph, Table, Row, Cell), satır içi içerik tipleri (Run, Shape, Comment) ve alan-makine tipleri (FieldStart, FieldSeparator, FieldEnd, ki bunlar bir Word alanının sınırlarını ve çalıştırma akışındaki metin geçişini işaret eder), aradığınızı belirten özel NodeType değerini geçirin.


Adım 5: Alt Ağaç Üzerinde XPath Sorguları Çalıştır

CompositeNode, alt ağaç üzerinde XPath tabanlı sorgular için SelectNodes(xpath) ve SelectSingleNode(xpath)‘yi de uygular; eşleşmeleri bir NodeList (veya tek bir Node) olarak döndürür. CompositeNode.GetEnumerator(), bir XPath sorgusu görevin gereksinimlerinden fazla olduğunda, bir düğümün doğrudan çocukları üzerinde basit bir foreach sağlar.


Adım 6: Düğümleri Ekle, Taşı ve Kaldır

Ağacı değiştirmek için, bir konteynerin çocuklarının başına veya sonuna bir düğüm eklemek üzere AppendChild(newChild) veya PrependChild(newChild)‘i çağırın ve mevcut bir çocuğa göre eklemek için InsertBefore(newChild, refChild) veya InsertAfter(newChild, refChild)‘ü kullanın. RemoveChild(oldChild) bir çocuğu kaldırır, RemoveAllChildren() ise tüm çocukları bir anda temizler; CompositeNode.IndexOf(child) bir çocuğun konumunu rapor eder. Node üzerinde, Clone(isCloneChildren) bir düğümü kopyalar — isteğe bağlı olarak çocuklarını da dahil eder — ve Remove() düğümü ebeveyninden ayırır.


Adım 7: Canlı Bir Koleksiyonu Değiştirmeden Önce Düğümleri Somutlaştır

Bir foreach döngüsü koleksiyon üzerinde yineleme yaparken koleksiyonu değiştirmek — ister bir NodeCollection olsun ister GetChildNodes sonucunu — bir hataya neden olur. İlk olarak koleksiyon üzerinde ToArray() çağırarak düğümleri sabit bir diziye somutlaştırın, ardından o dizi üzerinde yineleme yaparken Remove() çağırın veya ağaçta başka değişiklikler yapın.


Adım 8: Alt Ağacı Belge Sırasına Göre Tara

Node.NextPreOrder(rootNode) ve PreviousPreOrder(rootNode) belirli bir kök düğümle sınırlı olarak ağacı belge sırasına göre adım adım dolaşır — özyinelemeli geçiş kodu yazmadan tüm bir alt ağacı düğüm düğüm taramanın yaygın bir yolu.


Adım 9: DocumentVisitor ile Her Düğüm Türünü İşle

Birçok farklı düğüm tipini yapılandırılmış bir şekilde işlemek için, soyut DocumentVisitor sınıfını alt sınıfa alın ve ilgili düğüm tipleri için Visit*Start / Visit*End metotlarını geçersiz kılın — örneğin VisitParagraphStart / VisitParagraphEnd, VisitSectionStart / VisitSectionEnd, VisitBodyStart / VisitBodyEnd — ardından alt ağacın kökünde Node.Accept(visitor) çağırarak çalıştırın. Bu, her kullanım durumu için özel özyinelemeli geçiş kodu yazmadan bir belgeyi dışa aktarmak, dönüştürmek veya incelemek için standart bir desendir.


Adım 10: Diğer Kodlardan Gelen Yapısal Değişikliklere Tepki Ver

Kodun diğer kod tarafından yapılan eklemelere veya çıkarmalara — yerleşik işlemler dahil — doğrudan yapılan değişikliklere değil, tepki vermesi gerektiğinde INodeChangingCallback uygulayın. NodeInserting(args), NodeInserted(args), NodeRemoving(args) ve NodeRemoved(args) metodları her biri, etkilenen Node‘ı tanımlayan bir NodeChangingArgs, onun eski ve yeni ebeveynini ve gerçekleşen NodeChangingAction (Insert veya Remove) alır.

Yaygın Sorunlar ve Çözümler

Bir Düğümü CompositeNode tipine dönüştürmek geçersiz dönüşüm hatası fırlatır Düğüm bir yaprak tipidir – örneğin Run or FieldStart – ki çocuk tutamaz. Kontrol edin Node.IsComposite ilk önce, ya da kullan NodeType düğümün bir kapsayıcı tipinde olduğunu onaylamak için dönüştürmeden önce.

GetChildNodes isDeep false olduğunda doğrudan çocukları döndürür isDeep kaldı false (veya aşırı yükleme sığ varsayılan olduğunda atlanır). Geçirin isDeep: true to GetChildNodes() tüm alt ağacı anlık çocuklar yerine aramak için.

Bir koleksiyon üzerinde yineleme yaparken onu değiştirmek bir hata fırlatır Düğümler bir içinde eklendi veya kaldırıldı foreach bir üzerinde NodeCollection ya da sonucunun GetChildNodes. Çağır ToArray() ilk olarak değiştirilmesi gereken düğümleri somutlaştır, ardından ağacı değiştirirken o dizi üzerinde yinele.

Bir DocumentVisitor alt sınıfı bazı içerikler için çağrılmaz Ziyaretçi şu yoluyla çağrıldı Accept() gerçekten hedef içeriği içermeyen bir düğümde, ya da ilgili Visit* yöntem geçersiz kılınmamıştı. Çağır Accept() içeriği içeren bir ata üzerinde, ve her birini geçersiz kıl Visit*Start / Visit*End işlenen düğüm tipleriyle ilgili çifti.

INodeChangingCallback bir değişiklik hakkında bilgilendirilmez Geri arama yalnızca şunun üzerindeki değişiklikleri raporlar Document kayıtlı olduğu nesne üzerinde. Geri aramanın doğru Document örneğe değişiklik gerçekleşmeden önce bağlandığını doğrulayın, sonrasında değil.

Sıkça Sorulan Sorular

Node ve CompositeNode arasındaki fark nedir?

Node, her belge öğesinin türediği temel sınıftır. CompositeNode, Node‘yi, çocuk içerebilen öğeler için (örneğin Body, Paragraph ve Table) genişletir; Run gibi yaprak öğeler doğrudan Node‘den türetilir ve çocuk tutamaz.

Bir belgede belirli bir türdeki tüm düğümleri nasıl bulurum?

Aramayı kökleyen düğüm üzerinde CompositeNode.GetChildNodes(nodeType, isDeep)‘ı çağırın – genellikle Document kendisi – hedef NodeType ve isDeep: true‘ı geçirerek tüm alt ağacı, sadece doğrudan çocukları değil, arayın.

Döngü sırasında düğümleri güvenli bir şekilde nasıl kaldırırım?

Kaldırılacak düğümleri önce bir diziye toplayın – örneğin NodeCollection.ToArray() ile – ardından o dizi üzerinde döngü yapıp her düğümde Remove()‘i çağırın; böylece bir foreach döngü sırasında canlı koleksiyonu değiştirmekten kaçınırsınız.

FieldStart, FieldSeparator ve FieldEnd düğümleri nedir?

Bunlar, çalışma akışına gömülmüş bir Word alanının mekanizmasını işaretleyen NodeType değerleridir: FieldStart ve FieldEnd alanı bağlar, ve FieldSeparator alan kodunu şu anda görüntülenen sonucundan ayırır.

Bir belgede her paragrafı, tabloyu ve run’u nasıl işlerim?

Gerekli düğüm tipleri için Visit*Start / Visit*End yöntemlerini geçersiz kılarak DocumentVisitor sınıfından türetin, ardından Accept(visitor) yöntemini Document üzerinde (veya herhangi bir alt ağaç kökü üzerinde) çağırın.

Ayrıca Bakınız

 Türkçe