2012-07-30 4 views
1

J'ai une chaîne XML, en utilisant C# 2.0, je dois lire cette chaîne et former une paire de valeurs clés ou des listes séparées. Je dois utiliser ci-dessous XML pour le mappage de champ pour le service Web.Lire chaîne XML en utilisant C# 2.0

ci-dessous est mon échantillon de mon xml

<?xml version="1.0" encoding="utf-8" ?> 
<Integration> 
    <FiledMappings name ="Employee"> 
    <Field Name="EmployeeID"> 
     <DataSource>EmployeeNO</DataSource> 
    </Field> 
    <Field Name="Department"> 
     <DataSource>Department</DataSource> 
    </Field> 
    <Field Name="EmployeeName"> 
     <DataSource>Name</DataSource> 
    </Field> 
    </FiledMappings> 
</Integration> 
+0

Si votre o \ p dictionnaire être quelque chose comme ça '{ « EmployeeID ":" "EmployeeNO", "Département": "Département", ..... } '?? –

Répondre

3

Essayez ce code; Je Dictionary et XmlDocument:

var keyValues = new Dictionary<string, string>(); 

var document = new XmlDocument(); 
document.LoadXml(stringXml); 
foreach (XmlNode node in document.SelectNodes(@"//Field")) 
{ 
    keyValues.Add(node.Attributes["Name"].InnerText, 
        node.InnerText); 
} 
+0

Je cherche quelque chose dyanamic .. comme les noms peuvent changer en XML .. – msbyuva

+0

Merci pour la réponse, ça marche mais dans le cas où les noms changent en XML alors il pourrait ne pas reconnaître le champ @ // J'ai posté ma réponse ci-dessous dont j'ai utilisé les propriétés XML Nodelist .. – msbyuva

+0

@msbyuva: mon code était juste un exemple de code. vous devez le changer pour vos problèmes. – Ria

-1

Vous pouvez utiliser un disctionary par exemple ci-dessous

private static IDictionary<string, string> parseReplicateBlock(StreamReader reader) 
+0

Qu'est-ce que' parseReplicateBlock'? –

+0

tammy Je ne pouvais pas comprendre ce que vous essayez de dire .. – msbyuva

1

Vous pouvez utiliser le code suivant pour obtenir le dictionnaire requis:

 StringBuilder s = new StringBuilder(); 
     s.AppendLine("<?xml version=\"1.0\" encoding=\"utf-8\" ?>"); 
     s.AppendLine("<Integration>"); 
     s.AppendLine("<FiledMappings name =\"Employee\">"); 
     s.AppendLine("<Field Name=\"EmployeeID\">"); 
     s.AppendLine("<DataSource>EmployeeNO</DataSource>"); 
     s.AppendLine("</Field>"); 
     s.AppendLine("<Field Name=\"Department\">"); 
     s.AppendLine("<DataSource>Department</DataSource>"); 
     s.AppendLine("</Field>"); 
     s.AppendLine("<Field Name=\"EmployeeName\">"); 
     s.AppendLine("<DataSource>Name</DataSource>"); 
     s.AppendLine("</Field>"); 
     s.AppendLine("</FiledMappings>"); 
     s.AppendLine("</Integration>"); 

     Dictionary<string, string> d = new Dictionary<string, string>(); 

     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml(s.ToString()); 

     XmlNode x = doc.ChildNodes[1].ChildNodes[0]; 
     foreach (XmlNode n in x.ChildNodes) 
      d[n.Attributes[0].Value] = n.FirstChild.FirstChild.Value; 

     foreach (KeyValuePair<string, string> p in d) 
      Console.WriteLine(string.Format("{0}:\t{1}", p.Key, p.Value)); 

     Console.ReadLine(); 

Ou s'il peut sembler possible d'utiliser .Net 3.5, vous pouvez utiliser Linq au format xml, voir:

 StringBuilder s = new StringBuilder(); 
     s.AppendLine("<?xml version=\"1.0\" encoding=\"utf-8\" ?>"); 
     s.AppendLine("<Integration>"); 
     s.AppendLine("<FiledMappings name =\"Employee\">"); 
     s.AppendLine("<Field Name=\"EmployeeID\">"); 
     s.AppendLine("<DataSource>EmployeeNO</DataSource>"); 
     s.AppendLine("</Field>"); 
     s.AppendLine("<Field Name=\"Department\">"); 
     s.AppendLine("<DataSource>Department</DataSource>"); 
     s.AppendLine("</Field>"); 
     s.AppendLine("<Field Name=\"EmployeeName\">"); 
     s.AppendLine("<DataSource>Name</DataSource>"); 
     s.AppendLine("</Field>"); 
     s.AppendLine("</FiledMappings>"); 
     s.AppendLine("</Integration>"); 

     XElement x = XElement.Parse(s.ToString()); 

     Dictionary<string, string> d = x.Element("FiledMappings").Elements("Field").ToDictionary(e => e.Attribute("Name").Value, e => e.Element("DataSource").Value); 
     foreach (KeyValuePair<string, string> p in d) 
      Console.WriteLine(string.Format("{0}:\t{1}", p.Key, p.Value)); 

     Console.ReadLine(); 
+0

Évidemment, mon exemple n'a aucun contrôle de validité et applique que la structure de chaîne de xml d'entrée suit strictement l'exemple donné par msbyuva – horgh

+1

FYI, si vous construisez une chaîne pleine de constantes, il suffit de les ajouter (concaténer), il sera fusionné en une seule chaîne par le compilateur. En les jetant dans un constructeur de cordes, vous ne gagnez rien et perdez en lisibilité et en performance. Mieux encore, utilisez une chaîne littérale verbatim si vous voulez qu'elle couvre plusieurs lignes. –

+0

Je cherche quelque chose dyanamic .. comme les noms peuvent changer en XML .. et je dois utiliser. NET 2.0 – msbyuva

0

ce que j'ai pu faire dynamiquement:

private Dictionary<string, string> Load_XML_wsMapping(String _WSMapping) 
     { 
      // Web Service Mapping forms Key Value Pair 
      XmlDocument doc = new XmlDocument(_WSMapping); 
      doc.LoadXml(); 
      Dictionary<string, string> dictXMLMapping = new Dictionary<string, string>(); 

      try 
      { 
       XmlNodeList list = doc.FirstChild.NextSibling.FirstChild.ChildNodes; 

       for (int i = 0; i < list.Count; i++) 
       { 
        XmlElement el = ((System.Xml.XmlElement)(list[i])); 
        dictXMLMapping.Add(el.Attributes[0].Value, list[i].InnerText); 

       } 
      } 
      catch (Exception err) 
      { 

       throw new Exception("Error occurred while mapping Web Service -- Bad XML." + err.Message); 
      } 
      return dictXMLMapping ; 
     } 
Questions connexes