2009-01-06 4 views
5

Je reçois dynamique XML où je ne connais pas les noms d'attributs, si vous regardez le code XML et ... J'ai essayé de faire un exemple simple, je peut obtenir les valeurs d'attribut, par exemple "myName", "myNextAttribute", et "blah", mais je ne peux pas obtenir les noms d'attribut, c'est-à-dire "name", "nextAttribute", et "etc1". Toutes les idées, je me dis qu'il doit y avoir quelque chose de facile qui me manque ... mais je suis sûr de le manquer.obtenir le nom de l'attribut en plus de la valeur de l'attribut en xml

static void Main(string[] args) 
    { 
     string xml = "<test name=\"myName\" nextAttribute=\"myNextAttribute\" etc1=\"blah\"/>"; 

     TextReader sr = new StringReader(xml); 

     using (XmlReader xr = XmlReader.Create(sr)) 
     { 
      while (xr.Read()) 
      { 
       switch (xr.NodeType) 
       { 
        case XmlNodeType.Element: 
         if (xr.HasAttributes) 
         { 
          for (int i = 0; i < xr.AttributeCount; i++) 
          { 
           System.Windows.Forms.MessageBox.Show(xr.GetAttribute(i)); 
          } 
         } 
         break; 
        default: 
         break; 
       } 
      } 
     } 
    } 

Répondre

23

Vous pouvez voir dans MSDN:

if (reader.HasAttributes) { 
    Console.WriteLine("Attributes of <" + reader.Name + ">"); 
    while (reader.MoveToNextAttribute()) { 
    Console.WriteLine(" {0}={1}", reader.Name, reader.Value); 
    } 
    // Move the reader back to the element node. 
    reader.MoveToElement(); 
} 
+0

Merci, je pensais que ça devait être quelque chose de proche ... aussi j'ai trouvé dans mon original pour la boucle, j'aurais pu faire xr.MoveToAttribute (i) et obtenir le même effet. –

0

Votre commutateur est inutile puisque vous ne disposez d'un seul cas, essayez rouler que dans votre déclaration si la place.

if (xr.NodeType && xr.HasAttributes) 
{ 
    ... 
} 

Notez que l'opérateur & & évalue dans l'ordre, donc si xr.NoteType est faux, le reste des arguments sont ignorés et si le bloc est sauté.

+0

Dans cet exemple oui, j'ai plus de cas dans le scénario «monde réel», j'ai juste essayé de le garder propre. Merci quand même. –

Questions connexes