ডোমের সাধারণকরণ জাভা দিয়ে পার্সিং - এটি কীভাবে কাজ করে?


240

আমি এই টিউটোরিয়ালে একটি ডোম পার্সারের কোডের নীচে লাইনটি দেখেছি ।

doc.getDocumentElement().normalize();

কেন আমরা এই স্বাভাবিকীকরণ করি?
আমি ডকগুলি পড়েছি তবে একটি শব্দও বুঝতে পারি না।

এই নোডের নীচে উপ-গাছের সম্পূর্ণ গভীরতায় সমস্ত পাঠ্য নোড রাখে

ঠিক আছে, তাহলে কেউ এই গাছটি দেখতে কেমন (আমাকে পছন্দ করে একটি ছবি সহ) দেখাতে পারেন?

কেউ আমাকে ব্যাখ্যা করতে পারেন কেন স্বাভাবিককরণের প্রয়োজন?
আমরা স্বাভাবিক না হলে কী হয়?


আপনার প্রশ্ন নির্বিশেষে, দয়া করে উদাহরণটিতে নোটটি পড়ুন: "ডিওএম পার্সার ধীর গতির এবং এটি যখন প্রচুর ডেটাযুক্ত একটি এক্সএমএল ডকুমেন্ট লোড করে তখন প্রচুর স্মৃতি গ্রহণ করবে Please দয়া করে স্যাক্স পার্সারটিকে এর সমাধান হিসাবে বিবেচনা করুন, স্যাক্স দ্রুত DOM এর চেয়ে কম স্মৃতি ব্যবহার করুন "
উলফগারপ্রো

3
@ ওল্ফগার.প্রো - আপনি যা বলেছেন তা আমি বুঝতে পেরেছি। তবে, আমি প্রশ্নে জিজ্ঞাসা করা জিনিসগুলি বুঝতে চাই। আমি শীঘ্রই স্যাক্স পার্সিংও করব।
অ্যাপল গ্রিন্ডার

"নরমালাইজ এক্সএমএল" এর জন্য গুগল অনুসন্ধান করা এমন কিছু ফলাফল দিয়েছে যা দরকারী বলে মনে হয়। এটি দেখতে ডাটাবেসগুলির মধ্যে সাধারণীকরণের মতো।
অ্যাপল গ্রিন্ডার

2
@ ইজেপি - উম্ম ... এটি এখনও পরিষ্কার নয় কারণ আমি এক্সএমএল গভীরতার সাথে জানি না এবং আমি এটিতে কয়েকটি প্রারম্ভিক পৃষ্ঠা পড়েছি read বিটিডাব্লু, আমাকে ভুল বুঝবেন না, আপনি ডকটির লেখক ঠিক কী করেছেন - প্লেইন ইংলিশের পরিবর্তে জটিল শব্দ ব্যবহার করেছেন (পাইকের কর্মী হিসাবে প্লেইন = বোঝা সহজ)। সরল শব্দগুলি প্রথমে এবং জার্গন পরে আমার পক্ষে আরও ভাল কাজ করে।
অ্যাপল গ্রিন্ডার

7
এই লেখার হিসাবে রেফারেন্সড ওয়েবসাইটটি এই এসও পোস্টটিকে রেফারেন্স করছে। আমার মস্তিষ্ক কেবল নির্ভরতার ত্রুটি ছুঁড়ে ফেলেছে।
চেসোফনার্ড

উত্তর:


366

বাক্যটির বাকী অংশটি হ'ল:

যেখানে কেবল কাঠামো (যেমন, উপাদান, মন্তব্য, প্রক্রিয়াকরণের নির্দেশাবলী, সিডিএটিএ বিভাগ এবং সত্তা রেফারেন্স) পাঠ্য নোডগুলি পৃথক করে, অর্থাত্, এখানে সংলগ্ন পাঠ্য নোড বা খালি পাঠ্য নোড নেই।

এটির মূলত নিম্নলিখিত XML উপাদানটি means

<foo>hello 
wor
ld</foo>

একটি অস্বীকৃত নোডে এর মতো উপস্থাপন করা যেতে পারে:

Element foo
    Text node: ""
    Text node: "Hello "
    Text node: "wor"
    Text node: "ld"

যখন সাধারন করা হবে তখন নোডটি এর মতো দেখাবে

Element foo
    Text node: "Hello world"

এবং একই বৈশিষ্ট্যগুলির জন্য যায়: <foo bar="Hello world"/>মন্তব্যগুলি, ইত্যাদি for


2
আহা! এটি এখন আরও স্পষ্ট। আমি ডেটা স্ট্রাকচার (???) এবং নোড সম্পর্কে জানি না। তবে গাছের কাঠামোর দিকে আমার নজর ছিল এবং আমি অনুমান করছি যে কোনও কম্পিউটার আপনার পরামর্শ অনুসারে "হ্যালো ওয়ার্ল্ড" সঞ্চয় করতে পারে। এটা কি সঠিক ?
অ্যাপল গ্রাইন্ডার

9
আপনাকে ডিওএম সম্পর্কে বেসিকগুলি শিখতে হবে। হ্যাঁ, ডিওএম একটি গাছ হিসাবে একটি এক্সএমএল ডকুমেন্ট উপস্থাপন করে। এবং একটি গাছে, আপনার কাছে একটি মূল নোড রয়েছে যার মধ্যে শিশু নোড রয়েছে, প্রতিটি শিশু নোডে শিশু নোডও থাকে etc. ইত্যাদি a গাছটি এটি। এলিমেন্ট এক ধরণের নোড এবং টেক্সটনোড হ'ল নোডের অন্য ধরণের kind
জেবি নিজেট

7
ধন্যবাদ জেবি নিজেট। কিছু দিক পাওয়ার পরে আমি কতটা স্বস্তি পেয়েছি তা বলতে পারছি না।
অ্যাপল গ্রিন্ডার

2
@ ব্যবহারকারী 2043553, নতুন লাইনগুলি আসলে সেখানে পয়েন্ট। নিউলাইন ছাড়া, আপনি পার্থক্য দেখতে পাবেন না। যদি আপনার বুঝতে না পারা হত: সাধারণকরণটি এক্সএমএলকে "সংশোধন করে" তাই একটি ট্যাগকে একটি উপাদান হিসাবে ব্যাখ্যা করা হয়। যদি আপনি এটি না করেন, তবে এটি ঘটতে পারে যে এই খুব নিউলাইনগুলিকে একই ধরণের বিভিন্ন উপাদানগুলির মধ্যে (শর্ত। একই ট্যাগের মধ্যে) ডিলিমেটার হিসাবে ব্যাখ্যা করা হয়।
স্ট্যাকি

1
@ স্ট্যাকি, উদাহরণে দুটি নতুন লাইন রয়েছে, উদাহরণটিতে এগুলি স্বাভাবিক করার পরে এগুলি প্রদর্শিত হয় না যা মানুষকে বিশ্বাস করতে পারে যে সেখানে আর নেই। প্রদর্শিত নিউলাইনগুলির সাথে ফলাফল প্রাপ্ত পাঠ্য নোডটি দেখতে দেখতে এমন হবে: "হ্যালো \ n ওয়ার্ড \ nld" নরমালাইজিং নতুনলাইনগুলি সরিয়ে দেয় না।
খ্রিস্টান

10

সহজ কথায়, নরমালাইজেশন হ'ল রিডানড্যান্সিস হ্রাস।
রিন্ডানডেনসিগুলির উদাহরণ:
ক) মূল / ডকুমেন্ট ট্যাগের বাইরে সাদা স্পেস ( ... <ডকুমেন্ট> </ ডকুমেন্ট> ... )
খ) শুরুর ট্যাগের মধ্যে শূন্যস্থান (< ... >) এবং শেষ ট্যাগ (</ ... >)
গ) গুণাবলী এবং মধ্যবর্তী তাদের মান (অর্থাত। শূণ্যস্থান মধ্যে সাদা স্পেস কী নাম এবং = " )
ঘ) অতিরিক্ত নামস্থান ঘোষণা
ঙ) গুণাবলীর গ্রন্থে এবং ট্যাগ লাইন ব্রেক / সাদা স্পেস
চ) মন্তব্য ইত্যাদি ...


7

আরও প্রযুক্তিগত ব্যবহারকারীর জন্য @ জেবিনিজেটের উত্তরের এক্সটেনশন হিসাবে এখানে org.w3c.dom.Nodeইন্টারফেসের প্রয়োগটি com.sun.org.apache.xerces.internal.dom.ParentNodeকেমন দেখাচ্ছে তা আপনাকে বাস্তবে কীভাবে কাজ করে তা আপনাকে ধারণা দেয়।

public void normalize() {
    // No need to normalize if already normalized.
    if (isNormalized()) {
        return;
    }
    if (needsSyncChildren()) {
        synchronizeChildren();
    }
    ChildNode kid;
    for (kid = firstChild; kid != null; kid = kid.nextSibling) {
         kid.normalize();
    }
    isNormalized(true);
}

এটি পুনরাবৃত্তভাবে সমস্ত নোডকে অনুসরণ করে এবং কল করে kid.normalize()
এই প্রক্রিয়াটি ওভাররাইড করাorg.apache.xerces.dom.ElementImpl

public void normalize() {
     // No need to normalize if already normalized.
     if (isNormalized()) {
         return;
     }
     if (needsSyncChildren()) {
         synchronizeChildren();
     }
     ChildNode kid, next;
     for (kid = firstChild; kid != null; kid = next) {
         next = kid.nextSibling;

         // If kid is a text node, we need to check for one of two
         // conditions:
         //   1) There is an adjacent text node
         //   2) There is no adjacent text node, but kid is
         //      an empty text node.
         if ( kid.getNodeType() == Node.TEXT_NODE )
         {
             // If an adjacent text node, merge it with kid
             if ( next!=null && next.getNodeType() == Node.TEXT_NODE )
             {
                 ((Text)kid).appendData(next.getNodeValue());
                 removeChild( next );
                 next = kid; // Don't advance; there might be another.
             }
             else
             {
                 // If kid is empty, remove it
                 if ( kid.getNodeValue() == null || kid.getNodeValue().length() == 0 ) {
                     removeChild( kid );
                 }
             }
         }

         // Otherwise it might be an Element, which is handled recursively
         else if (kid.getNodeType() == Node.ELEMENT_NODE) {
             kid.normalize();
         }
     }

     // We must also normalize all of the attributes
     if ( attributes!=null )
     {
         for( int i=0; i<attributes.getLength(); ++i )
         {
             Node attr = attributes.item(i);
             attr.normalize();
         }
     }

    // changed() will have occurred when the removeChild() was done,
    // so does not have to be reissued.

     isNormalized(true);
 } 

আশা করি এটি আপনার কিছুটা সময় সাশ্রয় করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.