Partager via


XmlValidatingReader.ReadAttributeValue Méthode

Définition

Analyse la valeur d'attribut selon un ou plusieurs nœuds Text, EntityReference ou EndEntity.

public:
 override bool ReadAttributeValue();
public override bool ReadAttributeValue ();
override this.ReadAttributeValue : unit -> bool
Public Overrides Function ReadAttributeValue () As Boolean

Retours

true s'il y a des nœuds à retourner.

false si le lecteur n'est pas placé sur un nœud d'attribut quand l'appel initial est effectué ou si toutes les valeurs d'attributs ont été lues.

Un attribut vide, tel que , misc=""retourne true avec un nœud unique avec la valeur String.Empty.

Exemples

L’exemple suivant lit un attribut avec des nœuds de référence de texte et d’entité.

#using <System.Xml.dll>

using namespace System;
using namespace System::IO;
using namespace System::Xml;
int main()
{
   XmlValidatingReader^ reader = nullptr;
   try
   {
      
      //Create the XML fragment to be parsed.
      String^ xmlFrag = "<book genre='novel' misc='sale-item &h; 1987'></book>";
      
      //Create the XmlParserContext.
      XmlParserContext^ context;
      String^ subset = "<!ENTITY h 'hardcover'>";
      context = gcnew XmlParserContext( nullptr,nullptr,"book",nullptr,nullptr,subset,"","",XmlSpace::None );
      
      //Create the reader and set it to not expand general entities. 
      reader = gcnew XmlValidatingReader( xmlFrag,XmlNodeType::Element,context );
      reader->ValidationType = ValidationType::None;
      reader->EntityHandling = EntityHandling::ExpandCharEntities;
      
      //Read the misc attribute. Because EntityHandling is set to
      //ExpandCharEntities, the attribute is parsed into multiple text
      //and entity reference nodes.
      reader->MoveToContent();
      reader->MoveToAttribute( "misc" );
      while ( reader->ReadAttributeValue() )
      {
         if ( reader->NodeType == XmlNodeType::EntityReference )
                  
         //To expand the entity, call ResolveEntity.
         Console::WriteLine( "{0} {1}", reader->NodeType, reader->Name );
         else
                  Console::WriteLine( "{0} {1}", reader->NodeType, reader->Value );
      }
   }
   finally
   {
      if ( reader != nullptr )
            reader->Close();
   }

}

using System;
using System.IO;
using System.Xml;

public class Sample
{
  public static void Main()
  {
    XmlValidatingReader reader = null;

    try
    {
       //Create the XML fragment to be parsed.
       string xmlFrag ="<book genre='novel' misc='sale-item &h; 1987'></book>";

       //Create the XmlParserContext.
       XmlParserContext context;
       string subset = "<!ENTITY h 'hardcover'>";
       context = new XmlParserContext(null, null, "book", null, null, subset, "", "", XmlSpace.None);

       //Create the reader and set it to not expand general entities.
       reader = new XmlValidatingReader(xmlFrag, XmlNodeType.Element, context);
       reader.ValidationType = ValidationType.None;
       reader.EntityHandling = EntityHandling.ExpandCharEntities;

       //Read the misc attribute. Because EntityHandling is set to
       //ExpandCharEntities, the attribute is parsed into multiple text
       //and entity reference nodes.
       reader.MoveToContent();
       reader.MoveToAttribute("misc");
       while (reader.ReadAttributeValue()){
          if (reader.NodeType==XmlNodeType.EntityReference)
            //To expand the entity, call ResolveEntity.
            Console.WriteLine("{0} {1}", reader.NodeType, reader.Name);
          else
             Console.WriteLine("{0} {1}", reader.NodeType, reader.Value);
        }
     }
     finally
     {
        if (reader != null)
          reader.Close();
      }
  }
} // End class
Option Strict
Option Explicit

Imports System.IO
Imports System.Xml

Public Class Sample
    
    Public Shared Sub Main()
        Dim reader As XmlValidatingReader = Nothing
        
        Try
            'Create the XML fragment to be parsed.
            Dim xmlFrag As String = "<book genre='novel' misc='sale-item &h; 1987'></book>"
            
            'Create the XmlParserContext.
            Dim context As XmlParserContext
            Dim subset As String = "<!ENTITY h 'hardcover'>"
            context = New XmlParserContext(Nothing, Nothing, "book", Nothing, Nothing, subset, "", "", XmlSpace.None)
            
            'Create the reader and set it to not expand general entities. 
            reader = New XmlValidatingReader(xmlFrag, XmlNodeType.Element, context)
            reader.ValidationType = ValidationType.None
            reader.EntityHandling = EntityHandling.ExpandCharEntities
            
            'Read the misc attribute. Because EntityHandling is set to
            'ExpandCharEntities, the attribute is parsed into multiple text
            'and entity reference nodes.
            reader.MoveToContent()
            reader.MoveToAttribute("misc")
            While reader.ReadAttributeValue()
                If reader.NodeType = XmlNodeType.EntityReference Then
                    'To expand the entity, call ResolveEntity.
                    Console.WriteLine("{0} {1}", reader.NodeType, reader.Name)
                Else
                    Console.WriteLine("{0} {1}", reader.NodeType, reader.Value)
                End If
            End While
        Finally
            If Not (reader Is Nothing) Then
                reader.Close()
            End If
        End Try
    End Sub
End Class

Remarques

Notes

La XmlValidatingReader classe est obsolète dans .NET Framework 2.0. Vous pouvez créer une instance de validation à XmlReader l’aide de la XmlReaderSettings classe et de la Create méthode . Pour plus d'informations, consultez la section Notes de la page de référence XmlReader.

Utilisez cette méthode après l’appel MoveToAttribute pour lire le texte ou les nœuds de référence d’entité qui composent la valeur de l’attribut. le Depth des nœuds de valeur d’attribut est un plus la profondeur du nœud d’attribut. Incréments Depth et décrémentations d’un lorsque vous entrez et sortez des références d’entité générales.

Par exemple, supposons que vous disposez du code XML suivant : <test name="a &b; c"/>

où l’entité b est définie dans la définition de type de document (DTD) comme suit : <!ENTITY b "123">

Si EntityHandling a la valeur ExpandCharEntities, le code C# suivant retourne la valeur de l’attribut sous la forme de deux nœuds de texte et d’un nœud de référence d’entité :

reader.MoveToAttribute("name");
  while (reader.ReadAttributeValue())
  {
  if (reader.NodeType == XmlNodeType.Text)
  {
  // at this point reader.Value == "a " or " c"
  }
  else if (reader.NodeType == XmlNodeType.EntityReference)
  {
  // at this point reader.Name == "b"
  reader.ResolveEntity();
  while (reader.ReadAttributeValue() &&
  reader.NodeType != XmlNodeType.EndEntity)
  {
  // reader.Value == "123"
  }
  }
    }

S’applique à

Voir aussi