2010-12-05 19 views
0

Je suis un nouveau à la programmation, et j'ai un sérieux problème et je ne peux pas m'en sortir.Obtenir la valeur de XML tag xith XMLReader et ajouter à LinkedList C#

J'ai 5 URL XML. tel que http://www.shopandmiles.com/xml/3_119_3.xml

Ceci est une URL XML que je dois obtenir des valeurs et écrire dans la base de données dans des colonnes connexes. Mes noms de colonnes et les noms de balises XML correspondent. Lorsque j'écris le code ci-dessous, l'élément lecteur manque les valeurs xml nulles. Certaines balises n'ont pas de valeur à l'intérieur. Je dois les ajouter null à linkedlist car après ce code, je suis en train de parcourir la liste chaînée mais l'ordre ne correspond pas si je ne peux pas ajouter une valeur pour les valeurs null xml. Donc, les noms de colonnes et les données à l'intérieur ne correspondent pas. je perds la commande. Tout mon code est ici, vous pouvez également vérifier les commentaires dans le code si cela vous aide. Merci à tous.

public void WebServiceShopMilesCampaignsXMLRead(string URL) 
    { 
     XmlReader reader = XmlReader.Create(URL); 
     LinkedList<string> linkedList = new LinkedList<string>(); 

     List<ShopAndMilesCampaigns> shopMileCampaigns = new List<ShopAndMilesCampaigns>(); 

     try 
     { 
      while (reader.Read()) 
      { 
       switch (reader.NodeType) 
       { 
        case XmlNodeType.Text: 
         linkedList.AddLast(reader.Value); 
         break; 
       } 
      } 
     } 

     catch (XmlException exception) 
     { 
      Console.WriteLine("XML okurken bir sorun oluştu, hata detayı --> " + exception.Message); 
     } 

     LinkedListNode<string> node = linkedList.First; 

     while (node != null) 
     { 
      ShopAndMilesCampaigns shopMilesCampaign = new ShopAndMilesCampaigns(); 

      shopMilesCampaign.Name = node.Value; // Null values mixes up the order because i cant add as null with reader.read above 
      node = node.Next; 
      shopMilesCampaign.Summary = node.Value; 
      node = node.Next; 
      shopMilesCampaign.AccountName = node.Value; 
      node = node.Next; 
      shopMilesCampaign.Category = node.Value; 
      node = node.Next; 
      shopMilesCampaign.Sector = node.Value; 
      node = node.Next; 
      shopMilesCampaign.Details = node.Value; 
      node = node.Next; 
      shopMilesCampaign.Image = node.Value; 
      node = node.Next; 
      shopMilesCampaign.Status = 1; 
      node = node.Next; 

      shopMileCampaigns.Add(shopMilesCampaign); 
     } 

     foreach (ShopAndMilesCampaigns shopMileCampaign in shopMileCampaigns) 
     { 
      shopMileCampaign.Insert(); 
     } 
    } 
+0

Quelle est la taille des données? XmlReader est assez difficile parfois; à moins que les données soient volumineuses (dans ce cas, XML lui-même peut être un mauvais choix), je préférerais XmlSerializer (désérialiser dans un modèle objet) ou XElement (analyser dans un DOM). Ensuite, travaillez avec lui sous une forme plus conviviale ... –

+0

Les données ne sont pas trop grandes. Toutes les URL ont des données similaires à celle que je donne dans la question. S'il n'y a pas de choix, je vais essayer ces –

Répondre

0

J'ai trouvé la réponse. Ici, c'est pour vous le faire savoir.

Si XmlNodeType est égal à Element, la boucle continue à lire à partir des données XML et recherche Whitesapces et termine la balise Element of XML. Le code ci-dessous me donne la valeur exacte du tag XML même s'il est vide.

public LinkedList<string> AddToLinkedList(XmlReader reader) 
    { 

     LinkedList<string> linkedList = new LinkedList<string>(); 

     try 
     { 
      while (reader.Read()) 
      { 
       switch (reader.NodeType) 
       { 
        case XmlNodeType.Element: 
         reader.Read(); 
        Start: 
         if (reader.NodeType == XmlNodeType.Whitespace || reader.NodeType == XmlNodeType.Element) 
         { 
          reader.Read(); 
          goto Start; 
         } 
         else if (reader.NodeType == XmlNodeType.EndElement) 
         { 
          linkedList.AddLast(""); 
         } 
         else 
         { 
          linkedList.AddLast(reader.Value); 
         } 
         break; 
       } 
      } 
     }