2009-08-04 8 views
3

J'utilise VSTS2008 + C# + .Net 3.0. J'utilise le code ci-dessous pour sérialiser XML, voici mon code actuel et mon fichier XML sérialisé. Mon but est de faire en sorte que MyInnerObjectProperties appartienne à un espace de noms XML spécial (http://foo/2009) et de faire de cet espace de noms un espace de noms par défaut. Des idées comment mettre en œuvre cela?Placement d'une propriété dans un autre espace de noms XML avec sérialisation XML

Sortie courant:

<?xml version="1.0"?> 
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <MyObjectProperty> 
    <MyInnerObjectProperties> 
     <MyInnerObjectProperty> 
     <ObjectName>Foo Type</ObjectName> 
     </MyInnerObjectProperty> 
     <MyInnerObjectProperty> 
     <ObjectName>Goo Type</ObjectName> 
     </MyInnerObjectProperty> 
    </MyInnerObjectProperties> 
    </MyObjectProperty> 
</MyClass> 

Code actuel:

public class MyClass 
{ 
    private MyObject[] _myObjectProperty; 

    [XmlElement(IsNullable=false)] 
    public MyObject[] MyObjectProperty 
    { 
     get 
     { 
      return _myObjectProperty; 
     } 
     set 
     { 
      _myObjectProperty = value; 
     } 
    } 
} 
public class MyObject 
{ 
    private MyInnerObject[] _myInnerObjectProperty; 

    [XmlArrayItemAttribute("MyInnerObjectProperty", typeof(MyInnerObject), IsNullable=false)] 
    public MyInnerObject[] MyInnerObjectProperties 
    { 
     get 
     { 
      return _myInnerObjectProperty; 
     } 
     set 
     { 
      _myInnerObjectProperty = value; 
     } 
    } 
} 

public class MyInnerObject 
{ 
    public string ObjectName; 
} 

public class Program 
{ 
    static void Main(string[] args) 
    { 
     XmlSerializer s = new XmlSerializer(typeof(MyClass)); 
     FileStream fs = new FileStream("foo.xml", FileMode.Create); 
     MyClass instance = new MyClass(); 
     instance.MyObjectProperty = new MyObject[1]; 
     instance.MyObjectProperty[0] = new MyObject(); 
     instance.MyObjectProperty[0].MyInnerObjectProperties = new MyInnerObject[2]; 
     instance.MyObjectProperty[0].MyInnerObjectProperties[0] = new MyInnerObject(); 
     instance.MyObjectProperty[0].MyInnerObjectProperties[0].ObjectName = "Foo Type"; 
     instance.MyObjectProperty[0].MyInnerObjectProperties[1] = new MyInnerObject(); 
     instance.MyObjectProperty[0].MyInnerObjectProperties[1].ObjectName = "Goo Type"; 

     s.Serialize(fs, instance); 

     return; 
    } 
} 
+1

George, quand avez-vous arrêtez d'utiliser .NET 3.5 SP1? –

+0

John, je travaille sur plusieurs projets. Certains d'entre eux sont développés à partir de scrach, et je vais utiliser .Net 3.5 SP1 + .Net 2.0 SP2. Pour les projets hérités, je garderai sa version originale .Net. Il est dommage que LINQ ne puisse pas être utilisé dans des projets basés sur .Net 3.0. De toute façon, des idées pour ma question? – George2

+0

Je travaille dessus. Quelqu'un aura la réponse avant moi, j'en suis sûr. –

Répondre

1

Vous devez créer un XmlSerializerNamespaces objet et ajoutez vos espaces de noms nécessaires pour lui.

L'objet XmlSerializerNamespaces contient les espaces de noms XML et les préfixes que XmlSerializer utilise pour générer des noms qualifiés dans une instance de document XML.

Dans votre code C#:

XmlSerializerNamespaces myNameSpaces = new XmlSerializerNamespaces(); 
myNameSpaces.Add("MyInnerObject", "http://foo/2009"); 

Ensuite, ajoutez un attribut à votre classe, comme ceci:

public class MyInnerObject 
{ 
[XmlElement(Namespace = "http://foo/2009")] 

Plus d'infos sur:

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializernamespaces.aspx

+0

Merci Robert. Mon but n'est pas d'ajouter tout de la classe MyClass dans un espace de noms unifié, mais d'ajouter juste des éléments MyInnerObjectProperties dans l'espace de noms "http: // foo/2009". Je pense que votre solution va ajouter tous les éléments de la classe MyClass dans "http: // foo/2009", correct? Des idées pour mon problème? – George2

+1

Vous n'êtes pas obligé de l'utiliser pour toute la classe. Vous pouvez choisir les éléments et les attributs que vous voulez. Voir http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializernamespaces.aspx –

+1

J'ai modifié ma réponse pour qu'elle corresponde mieux à votre question. –

2

Que diriez-vous ceci:

[XmlArrayItemAttribute(Namespace = "http://foo.com/2009" /* other attr. params. */)] 
public MyInnerObject[] MyInnerObjectProperties 
{ 
    get { ... } 
    set { ... } 
} 
+0

Travailler, cool! Merci! – George2

2

Essayez

public class MyObject 
{ 
    [XmlArrayItemAttribute("MyInnerObjectProperty", typeof (MyInnerObject), 
     IsNullable = false)] 
    [XmlArray(Namespace = "http://foo.com/2009")] 
    public MyInnerObject[] MyInnerObjectProperties { get; set; } 
} 

pour moi, ce produit:

<?xml version="1.0" encoding="utf-8"?> 
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <MyObjectProperty> 
     <MyInnerObjectProperties xmlns="http://foo.com/2009"> 
      <MyInnerObjectProperty> 
       <ObjectName>Foo Type</ObjectName> 
      </MyInnerObjectProperty> 
      <MyInnerObjectProperty> 
       <ObjectName>Goo Type</ObjectName> 
      </MyInnerObjectProperty> 
     </MyInnerObjectProperties> 
    </MyObjectProperty> 
</MyClass> 
+1

+1 c'est ce que je pensais aussi .. –

Questions connexes