2011-09-07 3 views
2

Je souhaite ajouter plusieurs enregistrements un par un en utilisant la sérialisation XML. J'ai trois zones de texte et un bouton qui est utilisé pour obtenir les données de l'utilisateur, puis serializae dans le fichier XML. Cependant, quand j'ajoute un enregistrement, c'est bien, mais pour l'autre, il déclare plusieurs éléments racine que je ne suis pas capable de gérer.XML Sérialisation

que je fais sérialisation XML et je reçois cette erreur dans fichier XML

**<?xml version="1.0" encoding="utf-8"?> 
<sroot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:my-examples:shaping">** 
    <CustomerId>3a8bb49e-f616-49a5-8ec8-1886881c3042</CustomerId> 
    <FirstName>HASEEB</FirstName> 
    <LastName>KHAN</LastName> 
    <CustomerEmail>SDCFDS</CustomerEmail> 
**</sroot><?xml version="1.0" encoding="utf-8"?> 
<sroot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:my-examples:shaping">** 
    <CustomerId>6d2cbe5e-e1fb-4526-9f98-bf396b4ded55</CustomerId> 
    <FirstName>ammae</FirstName> 
    <LastName>wdfjk</LastName> 
    <CustomerEmail>sdkcbnk</CustomerEmail> 
</sroot> 

Comme vous pouvez le voir dans au-dessus du code XML qu'il ya plusieurs élément racine est écrit et je ne suis pas en mesure de corriger que je ont une classe appelée customer.cs et le code est écrit dans cette classe est

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Xml; 
using System.Xml.Serialization; 

namespace XmlSearlizeProject.Classes 
{ 
    [Serializable] 
    [XmlRoot(ElementName = "sroot", Namespace = "urn:my-examples:shaping")] 
    public class Customer 
    { 
     string id = default(string); 
     string firstName = default(string); 
     string lastName = default(string); 
     string email = default(string); 
     public Customer() 
     { 

     } 
     public Customer(string id, string firstName, string lastName, string email) 
     { 
      CustomerId = id; 
      FirstName = firstName; 
      LastName = lastName; 
      Email = email; 

     } 
     [XmlElement("CustomerId")] 
     public string CustomerId 
     { 
      get 
      { 
       return this.id; 
      } 
      set 
      { 
       this.id = value; 
      } 
     } 
     [XmlElement("FirstName")] 
     public string FirstName 
     { 
      get 
      { 
       return this.firstName; 
      } 
      set 
      { 
       this.firstName = value; 
      } 
     } 
     [XmlElement("LastName")] 
     public string LastName 
     { 
      get 
      { 
       return this.lastName; 
      } 
      set 
      { 
       this.lastName = value; 
      } 
     } 
     [XmlElement("CustomerEmail")] 
     public string Email 
     { 
      get 
      { 
       return this.email; 
      } 
      set 
      { 
       this.email = value; 
      } 
     } 
    } 
} 

et mon code C# est

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Xml.Serialization; 
using System.IO; 
using System.Xml; 
using System.Text; 
namespace XmlSearlizeProject.WebPages 
{ 
    public partial class CustomerPage : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     private void GeneralFunction(Stream xmlStream) 
     { 
      //xmlStream.Close(); 
      string customerId = Guid.NewGuid().ToString(); 
      Classes.Customer customer = new Classes.Customer(customerId,this.FirstNameTextBox.Text,this.LastNameTextBox.Text,this.EmailTextBox.Text); 
      XmlSerializer xmlSerializer = new XmlSerializer(typeof(Classes.Customer)); 
      XmlDocument document = new XmlDocument(); 
      document.Load(xmlStream); 

      XmlElement id = document.CreateElement("Id"); 
      id.InnerText = customerId; 
      document.DocumentElement.InsertAfter(id, document.DocumentElement.LastChild); 

      XmlElement firstName = document.CreateElement("rtgr"); 
      firstName.InnerText = customer.FirstName; 
      document.DocumentElement.InsertAfter(firstName, document.DocumentElement.LastChild); 

      XmlElement lastName = document.CreateElement("rtgtr"); 
      lastName.InnerText = customer.LastName; 
      document.DocumentElement.InsertAfter(lastName, document.DocumentElement.LastChild); 

      XmlElement email = document.CreateElement("grbfr"); 
      email.InnerText = customer.Email; 
      document.DocumentElement.InsertAfter(email, document.DocumentElement.LastChild); 
      XmlTextWriter xmlTextWriter = new XmlTextWriter(xmlStream, Encoding.UTF8); 
      xmlSerializer.Serialize(xmlTextWriter, customer); 

      xmlStream.Close(); 
     } 

     private void SerializeCustomer() 
     { 
      if (File.Exists(Server.MapPath("~/Customer.xml"))) 
      { 
       Stream xmlWriterStream = new FileStream(Server.MapPath("~/Customer.xml"), FileMode.Open, FileAccess.ReadWrite); 
       GeneralFunction(xmlWriterStream); 
       xmlWriterStream.Close(); 
      } 
     } 

     private void DeSerializeCustomer() 
     { 
      Stream xmlReaderStream = new FileStream(Server.MapPath("~/Customer.xml"), FileMode.Open, FileAccess.Read, FileShare.Read); 
      XmlSerializer xmlDeSerializer = new XmlSerializer(typeof(Classes.Customer)); 
      Classes.Customer customer = (Classes.Customer)xmlDeSerializer.Deserialize(xmlReaderStream); 
     } 

     protected void SubmitButton_Click(object sender, EventArgs e) 
     { 
      //if (!File.Exists(Server.MapPath("~/Customer.xml"))) 
      //{ 
       SerializeCustomer(); 
      //} 
      //else 
      //{ 
      // DeSerializeCustomer(); 
      //} 
     } 
    } 
} 

Répondre

2

Il semble que vous sérialisiez un client à la fois, plutôt que de sérialiser une liste/un tableau/une collection de clients dans le fichier XML.

La sérialisation fonctionne parce que vous avez 1 élément racine - Client. Toutefois, lors de la sérialisation de plusieurs, vous devrez sérialiser la collection de clients dans le fichier XML.

puis donc vous aurez (titre d'exemple seulement):

<Customers> 
<sroot/> 
<sroot/> 
</Customers> 

Quelques articles à regarder sur ce point:

C# Serializing a Collection of Objects

http://wcode.net/2009/08/serialize-collection-of-object-in-c/

http://www.codeproject.com/KB/cs/objserial.aspx

0

Définir comme définition de chema (xsd) dans le format que vous voulez que votre xml ressemble. Ensuite, vous pouvez utiliser des outils externes tels que xsd2code. Cela générerait automatiquement votre classe "Client" au format de votre xsd. (Dans le cas où vous le faites manuellement). Alors votre xml correspondra à la façon dont vous définissez dans votre xsd. Essayez-le, définir une xsd pour votre xml est toujours une meilleure pratique.

+0

mais mon problème est de supprimer plusieurs éléments racine du fichier xml. Existe-t-il un autre moyen de supprimer cet élément racine multiple du fichier xml sans utiliser xsd? – haseebkhan

0

Vous pourriez hériter de la liste quelque chose comme ça ...

[Serializable] 
[XmlRoot(ElementName = "sroot", Namespace = "urn:my-examples:shaping")] 
public class CustomerList : List<Customer> 
{ 
} 

[Serializable] 
public class Customer 
{ 
    ... 
} 

Exemple d'utilisation ...

CustomerList customerList = new CustomerList 
{ 
    new Customer 
    { 
     FirstName = "John", 
     LastName = "Doe", 
     Email = "[email protected]", 
     CustomerId = "123" 
    }, 
    new Customer 
    { 
     FirstName = "Jane", 
     LastName = "Doe", 
     Email = "[email protected]", 
     CustomerId = "456" 
    } 
}; 

Ensuite, votre méthode serait sérialiser la liste (par exemple de ListeClient) ...

SerializeCustomerList(CustomerList customers) 
{ 
    // Do serialize CustomerList instance... 
} 

Ensuite, le fichier XML résultant ressemblerait ...

<sroot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:my-examples:shaping"> 
    <Customer> 
    <CustomerId>123</CustomerId> 
    <FirstName>John</FirstName> 
    <LastName>Doe</LastName> 
    <CustomerEmail>[email protected]</CustomerEmail> 
    </Customer> 
    <Customer> 
    <CustomerId>456</CustomerId> 
    <FirstName>Jane</FirstName> 
    <LastName>Doe</LastName> 
    <CustomerEmail>[email protected]</CustomerEmail> 
    </Customer> 
</sroot> 

Espérons que ça aide!