web-dev-qa-db-fra.com

sérialisation XML - supprimer l'espace de noms

Je sérialise un objet en utilisant c #. Je reçois un résultat dans ce format ci-dessous

  <?xml version="1.0"?>
    <Users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Users>
        <User Id="11005477969327" CreateDate="06/03/2011" LastSendDate="1/1/0001" />
        <User Id="11034688201594" CreateDate="04/22/2012" LastSendDate="1/1/0001" />
       <Users 
    </User>

Mais je veux un résultat dans ce format.

<?xml version="1.0"?>
<Users>
  <User Id="11005477969327" SendDate="1/1/0001" NextSendDate="2/7/2012 11:13:30 AM" />
  <User Id="11034688201594" SendDate="1/1/0001" NextSendDate="2/7/2012 11:13:30 AM" />

</Users>

ici mon code

public class Users
    {
        [XmlArray("Users")]
        public List<User> ListData { get; set; }

        public string GetXML()
        {
            System.IO.MemoryStream ms = new System.IO.MemoryStream();

            XmlSerializer sr = new XmlSerializer(typeof(Users));
            sr.Serialize(ms, this);

            ms.Position = 0;
            return System.Text.Encoding.UTF8.GetString(ms.ToArray());
        }
    }

    public class User
    {
        [XmlAttribute("Id")]
        public Int64 UserId { get; set; }

        [XmlAttribute("CreateDate")]
        public string CreateDate { get; set; }

        [XmlAttribute("LastSendDate")]
        public string LastSendDate { get; set; }


    }
23
Pankaj

Vous devez simplement remplacer [XmlArray("Users")] par [XmlElement("User")]

Cet attribut indique au sérialiseur que vous souhaitez stocker tous ces éléments utilisateur sous un nœud particulier "Utilisateurs", si vous le remplacez par XmlElement, serialzer stockera tous ces utilisateurs en ligne (juste sous la première balise Utilisateurs) tout comme vous J'aime ça.

Pour ce qui est de xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" espaces de noms. Ils sont ajoutés automatiquement, mais ils sont inoffensifs, car tous vos éléments sont dans l'espace de noms par défaut. Vous pouvez ajouter le code suivant à votre appel XmlSerializer afin de les supprimer:

var xns = new XmlSerializerNamespaces();
var serializer = new XmlSerializer(users.GetType());
xns.Add(string.Empty, string.Empty);
//...
serializer.Serialize(stream, users, xns);
61

Vous devez écrire:

XmlSerializer sr = new XmlSerializer(typeof(Users));
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("","");
sr.Serialize(ms, this, ns);
4