.NET में नोड्स के साथ कैसे काम करें

.NET में नोड्स के साथ कैसे काम करें

यह गाइड दिखाता है कि कैसे सीधे एक Word दस्तावेज़ के नोड ट्री को चलाया, क्वेरी किया और संशोधित किया जाए Aspose.Words FOSS के लिये .NET, उपयोग करके Node and CompositeNode base classes जो Document, Section, Paragraph, Table, और हर अन्य document element पर निर्मित हैं। यह खोज को स्कोप करने को कवर करता है NodeType, प्रोग्रामेटिक रूप से नोड्स जोड़ने और हटाने, संरचनात्मक परिवर्तनों पर प्रतिक्रिया देने, और उपयोग करने DocumentVisitor type-dispatched traversal के लिये.

चरण-दर-चरण गाइड

चरण 1: पैकेज स्थापित करें

Aspose.Words FOSS for .NET अभी तक एक NuGet पैकेज प्रकाशित नहीं करता है – इसके बजाय लाइब्रेरी को स्रोत से बनाएँ। https://github.com/aspose-words-foss/Aspose.Words-FOSS-for-.NET.git को क्लोन करें, फिर Aspose.Words.sln को .NET SDK के साथ रिलीज़ कॉन्फ़िगरेशन में बनाएं और अपने प्रोजेक्ट से उत्पन्न Aspose.Words असेंबली को रेफ़रेंसेज़ में जोड़ें। लाइब्रेरी .NET Standard 2.0 को लक्षित करती है, इसलिए यह .NET Framework 4.6.2+ और .NET 6/8/10 पर चलती है।


चरण 2: आवश्यक क्लासेस आयात करें

एक using Aspose.Words; निर्देश जोड़ें – Node, CompositeNode, NodeType, NodeCollection, NodeList, INodeChangingCallback, और DocumentVisitor सभी Aspose.Words नेमस्पेस में Document के साथ मौजूद हैं।


चरण 3: नोड और CompositeNode बेस क्लासेज़ को समझें

डॉक्यूमेंट ट्री में प्रत्येक ऑब्जेक्ट एब्स्ट्रैक्ट Node क्लास से व्युत्पन्न होता है, जो NodeType (निर्दिष्ट करता है कि यह किस प्रकार का नोड है), ParentNode (enclosing CompositeNode), Document (स्वामित्व वाला डॉक्यूमेंट), और PreviousSibling / NextSibling को समान स्तर पर नोड्स के बीच चलने के लिए उजागर करता है। किसी नोड को कास्ट करने से पहले यह पता लगाने के लिए कि क्या वह बच्चों को समाहित कर सकता है, Node.IsComposite को जांचें। CompositeNode कंटेनर एलिमेंट्स के लिए Node को विस्तारित करता है — FirstChild, LastChild, और Count उसके त्वरित बच्चों का विवरण देते हैं, और HasChildNodes यह रिपोर्ट करता है कि कोई मौजूद हैं या नहीं।


चरण 4: प्रकार के अनुसार बच्चों को क्वेरी करें

दिए गए NodeType के सभी बच्चों को प्राप्त करने के लिए CompositeNode.GetChildNodes(nodeType, isDeep) को कॉल करें, और पूरे सबट्री को खोजने के लिए केवल सीधे बच्चों के बजाय isDeep: true पास करें, या प्रकार की परवाह किए बिना सभी नोड प्रकारों को मिलाने के लिए NodeType.Any पास करें। CompositeNode.GetChild(nodeType, index, isDeep) इंडेक्स द्वारा एकल मिलते हुए बच्चे को प्राप्त करता है। संरचनात्मक नोड प्रकारों (Document, Section, Body, Paragraph, Table, Row, Cell), इनलाइन कंटेंट प्रकारों (Run, Shape, Comment), और फ़ील्ड-मशीनरी प्रकारों (FieldStart, FieldSeparator, FieldEnd, जो Word फ़ील्ड की सीमाओं को और रन स्ट्रीम में स्विच टेक्स्ट को चिन्हित करते हैं), के लिए वह विशिष्ट NodeType मान पास करें जो आप खोज रहे हैं।


चरण 5: सबट्री में XPath क्वेरी चलाएँ

CompositeNode सबट्री में XPath-आधारित क्वेरी के लिए SelectNodes(xpath) और SelectSingleNode(xpath) को भी लागू करता है, जो मिलानों को NodeList के रूप में (या एकल Node) लौटाता है। जब एक XPath क्वेरी कार्य की आवश्यकता से अधिक हो, तो CompositeNode.GetEnumerator() नोड के सीधे बच्चों पर एक साधारण foreach का समर्थन करता है।


चरण 6: नोड्स को जोड़ें, स्थानांतरित करें और हटाएँ

ट्री को संशोधित करने के लिए, कंटेनर के बच्चों की शुरुआत या अंत में नोड जोड़ने हेतु AppendChild(newChild) या PrependChild(newChild) को कॉल करें, और मौजूदा बच्चे के सापेक्ष सम्मिलित करने के लिए InsertBefore(newChild, refChild) या InsertAfter(newChild, refChild) का प्रयोग करें। RemoveChild(oldChild) एक बच्चे को हटाता है, और RemoveAllChildren() सभी बच्चों को एक साथ साफ़ करता है; CompositeNode.IndexOf(child) बच्चे की स्थिति रिपोर्ट करता है। स्वयं Node पर, Clone(isCloneChildren) एक नोड की प्रतिलिपि बनाता है — वैकल्पिक रूप से उसके बच्चों को शामिल करते हुए — और Remove() नोड को उसके पैरेंट से अलग कर देता है।


चरण 7: लाइव कलेक्शन को बदलने से पहले नोड्स को मैटेरियलाइज़ करें

कलेक्शन को संशोधित करना जबकि एक foreach लूप उस पर इटररेट कर रहा हो — चाहे वह NodeCollection हो या GetChildNodes का परिणाम — एक त्रुटि उत्पन्न करता है। पहले कलेक्शन पर ToArray() को कॉल करें ताकि नोड्स को एक स्थिर एरे में मैटेरियलाइज़ किया जा सके, फिर उस एरे पर इटररेट करें जबकि Remove() को कॉल कर रहे हों या ट्री में अन्य परिवर्तन कर रहे हों।


चरण 8: दस्तावेज़ क्रम में एक सबट्री स्कैन करें

Node.NextPreOrder(rootNode) और PreviousPreOrder(rootNode) दिए गए रूट नोड द्वारा सीमित, दस्तावेज़ क्रम में ट्री को चरणबद्ध करते हैं — बिना रीकर्सिव ट्रैवर्सल कोड लिखे पूरे सबट्री को नोड-दर-नोड स्कैन करने का एक सामान्य तरीका।


चरण 9: DocumentVisitor के साथ प्रत्येक नोड प्रकार को प्रोसेस करें

कई विभिन्न नोड प्रकारों को संरचित तरीके से प्रोसेस करने के लिए, एब्स्ट्रैक्ट DocumentVisitor क्लास को सबक्लास बनाएं और उन नोड प्रकारों के लिए Visit*Start / Visit*End मेथड्स को ओवरराइड करें जो महत्वपूर्ण हैं — उदाहरण के तौर पर VisitParagraphStart / VisitParagraphEnd, VisitSectionStart / VisitSectionEnd, VisitBodyStart / VisitBodyEnd — फिर सबट्री की रूट पर Node.Accept(visitor) को कॉल करके इसे चलाएँ। यह दस्तावेज़ को एक्सपोर्ट, ट्रांसफ़ॉर्म या इंस्पेक्ट करने के लिए मानक पैटर्न है, बिना प्रत्येक उपयोग केस के लिए कस्टम रीकर्सिव ट्रैवर्सल लिखे।


चरण 10: अन्य कोड से संरचनात्मक बदलावों पर प्रतिक्रिया दें

जब कोड को अन्य कोड द्वारा किए गए सम्मिलन या हटाने — जिसमें बिल्ट-इन ऑपरेशन्स भी शामिल हैं — पर प्रतिक्रिया देनी हो, तब INodeChangingCallback को लागू करें — केवल सीधे किए गए बदलावों पर नहीं। इसके NodeInserting(args), NodeInserted(args), NodeRemoving(args), और NodeRemoved(args) मेथड्स प्रत्येक एक NodeChangingArgs प्राप्त करते हैं जो प्रभावित Node, उसके पुराने और नए पैरेंट, और हुए NodeChangingAction (Insert या Remove) का विवरण देता है।

सामान्य समस्याएँ और समाधान

एक Node को CompositeNode में कास्ट करने से एक invalid-cast त्रुटि उत्पन्न होती है नोड एक लीफ़ प्रकार है – उदाहरण के लिए Run or FieldStart – जो बच्चों को धारण नहीं कर सकता। जांचें Node.IsComposite पहले, या उपयोग करें NodeType कास्ट करने से पहले यह पुष्टि करने के लिए कि नोड एक कंटेनर प्रकार है।

GetChildNodes सीधे बच्चों को लौटाता है जब isDeep false हो isDeep छोड़ दिया गया false (या जहाँ ओवरलोड डिफ़ॉल्ट रूप से उथला होता है, वहाँ छोड़ दिया गया)। पास करें isDeep: true to GetChildNodes() तत्क्षण बच्चों के बजाय पूरे उपवृक्ष को खोजने के लिए।

संग्रह को इटररेट करते हुए संशोधित करने से त्रुटि उत्पन्न होती है नोड्स को एक के अंदर जोड़ा या हटाया गया foreach पर एक NodeCollection या का परिणाम GetChildNodes. कॉल करें ToArray() पहले उन नोड्स को वास्तविक रूप देने के लिए जिन्हें संशोधित करना है, फिर ट्री को बदलते हुए उस एरे पर इटररेट करें।

एक DocumentVisitor उपवर्ग कुछ सामग्री के लिए कॉल नहीं किया जाता विज़िटर को … के माध्यम से बुलाया गया Accept() एक नोड पर जो वास्तव में लक्ष्य सामग्री नहीं रखता है, या संबंधित Visit* विधि को ओवरराइड नहीं किया गया था। कॉल Accept() एक पूर्वज पर जो सामग्री रखता है, और हर Visit*Start / Visit*End जोड़ी जो प्रोसेस किए जा रहे नोड प्रकारों से संबंधित है।

INodeChangingCallback को किसी परिवर्तन की सूचना नहीं मिलती है कॉलबैक केवल परिवर्तन की रिपोर्ट करता है Document जिस पर यह पंजीकृत किया गया था। सुनिश्चित करें कि कॉलबैक सही Document इंस्टेंस से जुड़ा है परिवर्तन होने से पहले, बाद में नहीं।

अक्सर पूछे जाने वाले प्रश्न

Node और CompositeNode में क्या अंतर है?

Node वह बेस क्लास है जिससे प्रत्येक दस्तावेज़ तत्व विरासत में प्राप्त करता है। CompositeNode Node को विस्तारित करता है उन तत्वों के लिए जो चाइल्ड रख सकते हैं (जैसे Body, Paragraph, और Table); लीफ़ तत्व जैसे Run सीधे Node से विरासत में प्राप्त होते हैं और चाइल्ड नहीं रख सकते।

मैं दस्तावेज़ में किसी विशिष्ट प्रकार के सभी नोड्स कैसे खोजूँ?

CompositeNode.GetChildNodes(nodeType, isDeep) को उस नोड पर कॉल करें जो खोज की मूल है – अक्सर स्वयं Document – लक्ष्य NodeType और isDeep: true पास करके पूरे सबट्री को खोजें, केवल सीधे चाइल्ड नहीं।

इटरेट करते समय नोड्स को सुरक्षित रूप से कैसे हटाऊँ?

पहले हटाने के लिए नोड्स को एक एरे में इकट्ठा करें – उदाहरण के लिए NodeCollection.ToArray() के साथ – फिर उस एरे पर इटररेट करें और प्रत्येक नोड पर Remove() कॉल करें, बजाय इसके कि foreach इटररेट कर रहा हो तब लाइव कलेक्शन को संशोधित किया जाए।

FieldStart, FieldSeparator, और FieldEnd नोड्स क्या हैं?

वे NodeType मान हैं जो रन स्ट्रीम में एम्बेडेड वर्ड फ़ील्ड के मैकेनिज़्म को चिह्नित करते हैं: FieldStart और FieldEnd फ़ील्ड को बाइंड करते हैं, और FieldSeparator फ़ील्ड के कोड को उसके वर्तमान प्रदर्शित परिणाम से अलग करता है।

मैं दस्तावेज़ में प्रत्येक पैराग्राफ, टेबल और रन को कैसे प्रोसेस करूँ?

Subclass DocumentVisitor, आवश्यक नोड प्रकारों के लिए Visit*Start / Visit*End मेथड्स को ओवरराइड करें, फिर इसे चलाने के लिए Document पर Accept(visitor) को कॉल करें (या किसी भी सबट्री रूट पर)।

यह भी देखें

 हिन्दी