سؤال

ما هي الاختلافات الرئيسية بين SelectNodes و GetElementsByTagname.

هل كانت مفيدة؟

المحلول

SelectNodes هي طريقة محددة .NET/MSXML تحصل على قائمة من العقد المطابقة لـ xpath التعبير. يمكن لـ XPaths تحديد العناصر حسب اسم العلامة ولكن يمكنها أيضًا القيام بالكثير من قواعد الاختيار الأخرى الأكثر تعقيدًا.

getElementByTagname هي طريقة قياسية من المستوى 1 من المستوى الأول متوفرة في العديد من اللغات (ولكنها مكتوبة برأس المال G في الشباك). إنه يحدد العناصر فقط عن طريق اسم العلامة ؛ لا يمكنك أن تطلب منه تحديد العناصر بسمات معينة ، أو عناصر تحمل اسم العلامة a داخل العناصر الأخرى باسم العلامة b أو أي شيء ذكي من هذا القبيل. إنه أقدم وأبسط وفي بعض البيئات أسرع.

نصائح أخرى

SelectNodes يأخذ xpath التعبير كمعلمة ويعيد جميع العقد التي تتطابق مع هذا التعبير.

GetElementsByTagName يأخذ اسم علامة كمعلمة ويعيد جميع العلامات التي لها هذا الاسم.

SelectNodes لذلك أكثر تعبيرية ، حيث يمكنك كتابة أي GetElementsByTagName استدعاء ك SelectNodes اتصل ، ولكن ليس العكس. XPath هي وسيلة قوية للغاية للتعبير عن مجموعات من عقد XML ، مما يوفر طرقًا أكثر للتصفية أكثر من مجرد الاسم. XPATH ، على سبيل المثال ، يمكن تصفية باسم العلامة ، أسماء السمات ، المحتوى الداخلي والوظائف الإجمالية المختلفة على أطفال العلامات أيضًا.

SelectNodes () هو امتداد Microsoft إلى نموذج كائن المستند (DOM) (DOM) (MSDN). SelectNodes كما ذكرها Welbog وآخرون يأخذون تعبير XPath. أود أن أذكر الاختلاف مع getElementsByTagName () عند حذف عقدة XML.

الإجابة والرمز المقدم من المستخدم Chilberto في منتدى MSDN

يوضح الاختبار التالي الفرق من خلال تنفيذ نفس الوظيفة (إزالة العقد الشخص) ولكن باستخدام طريقة getElementByTagName () لتحديد العقد. على الرغم من أن نوع الكائن نفسه يتم إرجاع بنائه مختلف. SelectNodes () عبارة عن مجموعة من المراجع مرة أخرى إلى مستند XML. هذا يعني أنه يمكننا إزالة من المستند في foreach دون التأثير على قائمة المراجع. يظهر هذا من خلال عدد العلماء لم يتأثر. GetElementByTagName () هي مجموعة تعكس مباشرة العقد في المستند. هذا يعني أننا نزيل العناصر الموجودة في الوالد ، فإننا نؤثر فعليًا على مجموعة العقد. هذا هو السبب في أنه لا يمكن التلاعب بالمؤسسة في Foreach ولكن كان لا بد من تغييرها إلى حلقة من الوقت.

.NET SelectNodes ()

    [TestMethod]
    public void TestSelectNodesBehavior()
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(@"<root>
                               <person>
                                 <id>1</id>
                                 <name>j</name>
                                </person>
                                <person>
                                  <id>2</id>
                                  <name>j</name>
                                </person>
                                <person>
                                  <id>1</id>
                                  <name>j</name>
                                 </person>
                                 <person>
                                   <id>3</id>
                                   <name>j</name>
                                  </person>
                                  <business></business>
                                </root>");

        XmlNodeList nodeList = doc.SelectNodes("/root/person");

        Assert.AreEqual(5, doc.FirstChild.ChildNodes.Count, "There should have been a total of 5 nodes: 4 person nodes and 1 business node");
        Assert.AreEqual(4, nodeList.Count, "There should have been a total of 4 nodes");

        foreach (XmlNode n in nodeList)
            n.ParentNode.RemoveChild(n);

        Assert.AreEqual(1, doc.FirstChild.ChildNodes.Count, "There should have been only 1 business node left in the document");
        Assert.AreEqual(4, nodeList.Count, "There should have been a total of 4 nodes");
    }

.net getElementsByTagname ()

    [TestMethod]
    public void TestGetElementsByTagNameBehavior()
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(@"<root>
                               <person>
                                 <id>1</id>
                                 <name>j</name>
                                </person>
                                <person>
                                  <id>2</id>
                                  <name>j</name>
                                </person>
                                <person>
                                  <id>1</id>
                                  <name>j</name>
                                 </person>
                                 <person>
                                   <id>3</id>
                                   <name>j</name>
                                  </person>
                                  <business></business>
                                </root>");;

        XmlNodeList nodeList = doc.GetElementsByTagName("person");

        Assert.AreEqual(5, doc.FirstChild.ChildNodes.Count, "There should have been a total of 5 nodes: 4 person nodes and 1 business node");
        Assert.AreEqual(4, nodeList.Count, "There should have been a total of 4 nodes");

        while (nodeList.Count > 0)
            nodeList[0].ParentNode.RemoveChild(nodeList[0]);

        Assert.AreEqual(1, doc.FirstChild.ChildNodes.Count, "There should have been only 1 business node left in the document");
        Assert.AreEqual(0, nodeList.Count, "All the nodes have been removed");
    }

باستخدام SelectNodes () نحصل على جمع / قائمة من المراجع لعقد مستند XML. يمكننا التلاعب مع تلك المراجع. إذا حذفنا العقدة ، فسيكون التغيير مرئيًا لمستند XML ، ولكن جمع / قائمة المراجع هو نفسه (على الرغم من أن العقدة التي تم حذفها ، إلا أنها نقاط مرجعية الآن إلى NULL -> System.NullReferenceException) على الرغم من أنني لا أعرف حقًا كيف يتم تنفيذ هذا. أفترض أنه إذا استخدمنا nodeList xmlnodelist = getElementsByTagName () وحذف العقدة مع nodelist [i] .parentnode.removechild (nodeList [i]) مرجع/حذف في متغير nodelist.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top