Osorterad nodhämtning efter namn eller index

XmlNamedNodeMap beskrivs i W3C-specifikationen (World Wide Web Consortium) som NamedNodeMap och krävs för att hantera en osorterad uppsättning noder med möjlighet att referera till noder efter namn eller index. Det enda sättet att få åtkomst till en XmlNamedNodeMap är när en XmlNamedNodeMap returneras via en metod eller egenskap. Det finns tre metoder eller egenskaper som returnerar en XmlNamedNodeMap:

  • XmlElement.Attributes

  • XmlDocumentType.Entiteter

  • XmlDocumentType.Notations

Egenskapen XmlDocumentType.Entities hämtar till exempel samlingen xmlEntity-noder som deklarerats i dokumenttypdeklarationen. Den här samlingen returneras som en XmlNamedNodeMap och du kan iterera genom samlingen med hjälp av egenskapen Count och visa entitetsinformation. Ett exempel på iterering via en XmlNamedNodeMap finns i Entities.

XmlAttributeCollection härleds från XmlNamedNodeMap och endast attribut kan ändras, medan noteringar och entiteter är skrivskyddade. Med hjälp av XmlNamedNodeMap för attributen kan du hämta noder för dessa attribut baserat på deras XML-namn. Det här är en enkel metod för att ändra samlingen med attribut på en elementnod. Detta kan jämföras direkt med XmlNodeList, som även implementerar det IEnumerable-gränssnittet , men med en indexåtkomstor i stället för en sträng. Metoderna RemoveNamedItem och SetNamedItem används endast mot en XmlAttributeCollection. Om du lägger till eller tar bort från en attributsamling, oavsett om du använder AttributeCollection eller XmlNamedNodeMap-implementeringen , ändras attributsamlingen för elementet. I följande kodexempel visas hur du flyttar ett attribut och skapar ett nytt attribut.

Imports System  
Imports System.Xml  
  
Class test  
  
    Public Shared Sub Main()  
        Dim doc As New XmlDocument()  
        doc.LoadXml("<root> <child1 attr1='val1' attr2='val2'> text1 </child1> <child2 attr3='val3'> text2 </child2> </root> ")  
  
        ' Get the attributes of node "child2 "  
        Dim ac As XmlAttributeCollection = doc.DocumentElement.ChildNodes(1).Attributes  
  
        ' Print out the number of attributes and their names.  
        Console.WriteLine(("Number of Attributes: " + ac.Count))  
        Dim i As Integer  
        For i = 0 To ac.Count - 1  
            Console.WriteLine((i + 1 + ".  Attribute Name: '" + ac(i).Name + "'  Attribute Value:  '" + ac(i).Value + "'"))  
        Next i  
        ' Get the 'attr1' from child1.  
        Dim attr As XmlAttribute = doc.DocumentElement.ChildNodes(0).Attributes(0)  
  
        ' Add this attribute to the attributecollection "ac".  
        ac.SetNamedItem(attr)  
  
        ''attr1' will be removed from 'child1' and added to 'child2'.  
        ' Print out the number of attributes and their names.  
        Console.WriteLine(("Number of Attributes: " + ac.Count))  
  
        For i = 0 To ac.Count - 1  
            Console.WriteLine((i + 1 + ".  Attribute Name: '" + ac(i).Name + "'  Attribute Value:  '" + ac(i).Value + "'"))  
        Next i  
        ' Create a new attribute and add to the collection.  
        Dim attr2 As XmlAttribute = doc.CreateAttribute("attr4")  
        attr2.Value = "val4"  
        ac.SetNamedItem(attr2)  
  
        ' Print out the number of attributes and their names.  
        Console.WriteLine(("Number of Attributes: " + ac.Count))  
  
        For i = 0 To ac.Count - 1  
            Console.WriteLine((i + 1 + ".  Attribute Name: '" + ac(i).Name + "'  Attribute Value:  '" + ac(i).Value + "'"))  
        Next i  
    End Sub 'Main  
End Class 'test  
using System;  
using System.Xml;  
class test {  
    public static void Main() {  
        XmlDocument doc = new XmlDocument();  
        doc.LoadXml( "<root> <child1 attr1='val1' attr2='val2'> text1 </child1> <child2 attr3='val3'> text2 </child2> </root> " );  
  
        // Get the attributes of node "child2"  
        XmlAttributeCollection ac = doc.DocumentElement.ChildNodes[1].Attributes;  
  
        // Print out the number of attributes and their names.  
        Console.WriteLine( "Number of Attributes: "+ac.Count );  
        for( int i = 0; i < ac.Count; i++ )  
            Console.WriteLine( (i+1) + ".  Attribute Name: '" +ac[i].Name+ "'  Attribute Value:  '"+ ac[i].Value +"'" );
  
        // Get the 'attr1' from child1.  
        XmlAttribute attr = doc.DocumentElement.ChildNodes[0].Attributes[0];  
  
        // Add this attribute to the attributecollection "ac".  
        ac.SetNamedItem( attr );  
  
        // 'attr1' will be removed from 'child1' and added to 'child2'.  
        // Print out the number of attributes and their names.  
        Console.WriteLine( "Number of Attributes: "+ac.Count );
        for( int i = 0; i < ac.Count; i++ )  
            Console.WriteLine( (i+1) + ".  Attribute Name: '" +ac[i].Name+ "'  Attribute Value:  '"+ ac[i].Value +"'" );
  
        // Create a new attribute and add to the collection.  
        XmlAttribute attr2 = doc.CreateAttribute( "attr4" );  
        attr2.Value = "val4";  
        ac.SetNamedItem( attr2 );  
  
        // Print out the number of attributes and their names.  
        Console.WriteLine( "Number of Attributes: "+ac.Count );
        for( int i = 0; i < ac.Count; i++ )  
            Console.WriteLine( (i+1) + ".  Attribute Name: '" +ac[i].Name+ "'  Attribute Value:  '"+ ac[i].Value +"'" );
  
    }  
}  

Ett ytterligare kodexempel som visar ett attribut som tas bort från ett AttributeCollection finns i XmlNamedNodeMap.RemoveNamedItem-metoden. Mer information om metoder och egenskaper finns i XmlNamedNodeMap-medlemmar.

Se även