Сериализация XML - PullRequest
       1

Сериализация XML

2 голосов
/ 07 сентября 2011

Я хочу добавить несколько записей одну за другой, используя сериализацию XML.У меня есть три текстовых поля и кнопка, которая используется для получения данных от пользователя и затем сериализации в 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>

Как вы можете видеть в приведенном выше коде XML, что записано несколько корневых элементов, и я не могу исправить, что у меня есть класс под названием customer.cs, и код написан в этом классеэто

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;
            }
        }
    }
}

А мой код C #

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();
            //}
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 07 сентября 2011

Похоже, что вы сериализуете одного клиента за раз, в отличие от сериализации списка / массива / коллекции клиентов в файл XML.

Сериализация одного работает, потому что у вас есть 1 корневой элемент - Клиент.Однако при сериализации многих вам потребуется сериализовать набор клиентов в файл XML.

Итак, у вас будет (только для примера):

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

Несколько статейпосмотреть на это:

C # Сериализация коллекции объектов

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

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

0 голосов
/ 08 сентября 2011

Вы можете просто наследовать из списка что-то вроде этого ...

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

[Serializable]
public class Customer
{
    ...
}

Пример использования ...

CustomerList customerList = new CustomerList 
{ 
    new Customer
    {
        FirstName = "John",
        LastName = "Doe",
        Email = "johndoe@foobar.com",
        CustomerId = "123"
    },
    new Customer
    {
        FirstName = "Jane",
        LastName = "Doe",
        Email = "janedoe@foobar.com",
        CustomerId = "456"
    }
};

Тогда ваш метод будет сериализовать список (экземпляр CustomerList)...

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

Тогда полученный XML будет выглядеть так ...

<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>johndoe@foobar.com</CustomerEmail>
  </Customer>
  <Customer>
    <CustomerId>456</CustomerId>
    <FirstName>Jane</FirstName>
    <LastName>Doe</LastName>
    <CustomerEmail>janedoe@foobar.com</CustomerEmail>
  </Customer>
</sroot>

Надеюсь, это поможет!

0 голосов
/ 07 сентября 2011

Определите определение схемы (xsd) в том формате, в котором вы хотите, чтобы ваш xml был похож.Затем вы можете использовать некоторые внешние инструменты, такие как xsd2code .Это автоматически сгенерирует ваш класс "Customer" в формате вашего xsd.(Если вы делаете это вручную).Тогда ваш xml будет соответствовать тому, как вы определяете его в xsd.Попробуйте, определение xsd для вашего xml всегда лучше.

...