2010-11-21 5 views
2

Pour ce xml (dans une colonne XML SQL 2005):obtenir les attributs XML de SQL

<doc> 
<a>1</a> 
<b ba="1" bb="2" bc="3" /> 
<c bd="3"/> 
<doc> 

Je voudrais être en mesure de récupérer les noms des attributs (ba, bb, bc, bd) plutôt que les valeurs à l'intérieur de l'utilisation des fenêtres C# forment une application.

+0

avez pas vous juste demandé celui-ci avant? http://stackoverflow.com/questions/4237327/getting-attributes-and-values-of-xml-using-c –

+0

oui mais ce n'était pas la réponse exacte qui m'aide ... j'espère pouvoir le préciser – salman

+0

Salman votre Xml n'est pas au format correct, '' devrait être à la fin, Vous pouvez ignorer 'attr.Value' dans le code que j'ai posté pour vous, si vous résolvez votre problème xml actuel, vous obtiendrez' ba, bb , bc, bd' aussi vous devriez supprimer les sorties supplémentaires. –

Répondre

0

Il y a deux façons de le faire dans votre cas:

  • Si vous pouvez créer des procédures stockées sur votre serveur SQL:
    Vous pouvez créer une procédure stockée qui désassemble le XML en colonnes, et facilement SELECT eux et ont l'application C# gérer comme si c'était une table avec des colonnes et des lignes.

  • Si vous ne pouvez pas:
    Vous pouvez démonter le XML en C# en utilisant SqlXml de l'espace de noms System.Xml.

Les deux méthodes sont expliquées avec des exemples très bien ici:
http://msdn.microsoft.com/en-us/library/ms345117(SQL.90).aspx#sql2k5xml_topic4

+0

je veux un soutien en C# plz ne me fais pas dans le mauvais chemin – salman

+0

@salman; le deuxième choix que je vous ai donné est C#. – BeemerGuy

1

Essayez quelque chose comme ça - la première méthode chargera la chaîne XML à partir de la base de données (ajuster la chaîne de connexion et requête à votre base de données, serveur, table, noms de colonnes), et la seconde méthode analyser la chaîne XML chargée de la base de données dans une liste de noms d'attributs en fonction de la réponse que vous avez à votre question précédente:

static void Main(string[] args) 
    { 
     string xmlContent = GrabStringFromDatabase(1); 
     List<string> attributeNames = ParseForAttributeNames(xmlContent); 

     Console.WriteLine("Your XML attributes are: {0}", string.Join(",", attributeNames.ToArray())); 
    } 

    private static string GrabStringFromDatabase(int ID) 
    { 
     string result = string.Empty; 
     string connection = "server=(local);database=test;integrated security=SSPI"; 
     string query = "SELECT XmlContent FROM dbo.TestXml WHERE ID = @ID"; 

     using(SqlConnection _con = new SqlConnection(connection)) 
     using (SqlCommand _cmd = new SqlCommand(query, _con)) 
     { 
      _cmd.Parameters.Add("@ID", SqlDbType.Int).Value = ID; 

      _con.Open(); 
      result = _cmd.ExecuteScalar().ToString(); 
      _con.Close(); 
     } 

     return result; 
    } 

    private static List<string> ParseForAttributeNames(string xmlContent) 
    { 
     List<string> attributeNames = new List<string>(); 

     XDocument xmlDoc = XDocument.Parse(xmlContent); 

     var nodeAttrs = xmlDoc.Descendants().Select(x => x.Attributes()); 

     foreach (var attrs in nodeAttrs) 
     { 
      foreach (var attr in attrs) 
      { 
       attributeNames.Add(attr.Name.LocalName); 
      } 
     } 

     return attributeNames; 
    } 
Questions connexes