2013-02-01 5 views
1

Je chaîne simillar àComment lire chaîne XML dans la liste ou toute collection

xmlDataEntAddAttr = @"<ADDITIONAL INFO> 
          <Host> Test Host Name </Host> 
          <IP Address>Test IP Address</IP Address> 
          <Domain>Test Domain</Domain> 
          <Host Method>Test Host Method</Host Method> 
          <Flag>Test Flag</Flag> 
         </ADDITIONAL INFO>"; 

Comment puis-je lire dans une liste de chaînes avec les noms de balises et valeurs dans ou dans toute collection. S'il vous plaît pas les étiquettes intérieures comme <Host></Host> peut être n'importe quelle valeur seule chose constante ici est la racine signifie <ADDITIONAL INFO></ADDITIONAL INFO>.

Veuillez suggérer n'importe quelle méthode pour analyser.

+0

Qu'est-ce que vous voulez dire par une liste de chaînes? Voulez-vous votre liste à 5 éléments avec les valeurs de chaque tag 5? ou voulez-vous les tags eux-mêmes aussi? Plus précisément, je me demande si vous voulez ' Nom d'hôte de test' ou 'Test Host Name' dans votre liste – psubsee2003

+0

@ psubsee2003 Je veux à la fois le nom de tag' 'et la valeur de tag' Test Host Name' dans la liste ou toute collection – Pratik

Répondre

3

Utilisez un XDocument (dans l'espace de noms System.Xml.Linq) et Linq to Xml.

XDocument xDocument = XDocument.Parse(xmlDataEntAddAttr); 
Dictionary<string, string> result = xDocument.Root.Elements().ToDictionary(element => element.Name.LocalName, element => element.Value); 

Cependant, votre chaîne n'est pas un fichier XML valide. Vous ne pouvez pas avoir d'espace dans les noms d'élément XML. Une version valide de vous chaîne est:

xmlDataEntAddAttr = @"<ADDITIONAL_INFO> 
          <Host> Test Host Name </Host> 
          <IP_Address>Test IP Address</IP_Address> 
          <Domain>Test Domain</Domain> 
          <Host_Method>Test Host Method</Host_Method> 
          <Flag>Test Flag</Flag> 
         </ADDITIONAL_INFO>"; 
+0

Merci beaucoup, C'est exactement ce dont j'avais besoin, mais est-il possible de lire les éléments XML avec de l'espace du tout, car les données qui arrivent en XML sont difficiles à changer. – Pratik

+0

@Pratik Si des espaces sont présents dans les noms d'éléments, ils ne sont pas appelés XML car ils ne sont pas conformes à la spécification XML. Donc, sauf si vous voulez créer votre propre analyseur XML corrompu, je vous recommande de réparer la source XML. –

+0

Appréciez les commentaires de Cedric en créant un mauvais parser qui sera une mauvaise option. Mettra en œuvre le changement dans les éléments XML lui-même. Un grand merci pour l'aide – Pratik

1

Si mon xml est structuré comme suit:

<nodes> 
    <node id="123"> 
     <text>text goes here</text> 
    </node> 
</nodes> 

alors je pourrais le faire:

XDocument xDoc; 
using(StringReader sr = new StringReader("thexml")) 
{ 
    xDoc = XDocument.Load(sr); 
} 
myDictionary = xDoc.Descendants("node").ToDictionary(x => x.Attribute("id").Value, x =>   x.Descendants("text").First().Value); 
+0

Appréciez votre aide Will, mais ma solution est plus proche de la réponse de Cedric.Merci – Pratik

1

Notez que vous devez retirer la espaces dans Informations supplémentaires, adresse IP et méthode hôte

 var xmlDataEntAddAttr = @"<?xml version=""1.0""?> 
         <ADDITIONALINFO> 
         <Host> Test Host Name </Host> 
         <IPAddress>Test IP Address</IPAddress> 
         <Domain>Test Domain</Domain> 
         <HostMethod>Test Host Method</HostMethod> 
         <Flag>Test Flag</Flag> 
        </ADDITIONALINFO>"; 
     var xDocument = XDocument.Parse(xmlDataEntAddAttr); 
     if (xDocument.Root != null) 
     { 
      var coll = xDocument.Root.Elements().Select(x => new {Name = x.Name, Value = x.Value}); 
      foreach (var item in coll) 
      { 
       Console.WriteLine("Name: {0}\tValue: {1}", item.Name, item.Value); 
      } 
     } 
     Console.ReadLine(); 
+0

Merci TYY pour votre aide :) – Pratik

Questions connexes