2009-08-04 5 views
3

Ich verwende VSTS2008 + C# +. Net 3.0. Ich verwende unten Code, um XML zu serialisieren, und mein Objekt enthält Array-Typ-Eigenschaft, und ich möchte einen zusätzlichen Elemente 'Schicht ("MyInnerObjectProperties" Element-Layer in meinen erwarteten Ergebnissen unten hinzufügen, und ich möchte "MyInnerObjectProperties" Element als übergeordnetes Element Element für alle MyInnerObjectProperty -Elemente). Irgendwelche Ideen?Wrapping serialisierte Array-Elemente mit dem Namen des Array

Aktuelle serialisierten XML,

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

Erwartete serialisierten XML,

<?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> 

Aktueller Code,

public class MyClass 
{ 
    private MyObject[] _myObjectProperty; 

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

    [XmlElement(IsNullable = false)] 
    public MyInnerObject[] MyInnerObjectProperty 
    { 
     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].MyInnerObjectProperty = new MyInnerObject[2]; 
     instance.MyObjectProperty[0].MyInnerObjectProperty[0] = new MyInnerObject(); 
     instance.MyObjectProperty[0].MyInnerObjectProperty[0].ObjectName = "Foo Type"; 
     instance.MyObjectProperty[0].MyInnerObjectProperty[1] = new MyInnerObject(); 
     instance.MyObjectProperty[0].MyInnerObjectProperty[1].ObjectName = "Goo Type"; 

     s.Serialize(fs, instance); 

     return; 
    } 
} 

Antwort

5

nutzen die XmlArrayItemAttribute

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

Ihre Lösung funktioniert! Cool! – George2

+1

@ George2: Bitte schauen Sie sich die aktualisierte Antwort an, Sie müssen nicht den Namen Ihrer Eigenschaft ändern, nur die Deklaration. Ich habe XmlArray hinzugefügt, um den Elementnamen umzubenennen. –

+1

durch Deklaration ich meine..die deklarative Syntax von der Serialisierung verwendet ... –

2
... 
    [XmlArray(IsNullable = false)] 
    [XmlArrayItem("MyInnerObjectProperties")] 
    public MyObject[] MyObjectProperty 
    { 
     get 
     { 
      return _myObjectProperty; 
     } 
     set 
     { 
      _myObjectProperty = value; 
     } 
    } 
    ... 
+1

Dies wird nicht die gewünschte XML erstellen ... es wird MyObject-Knoten dort drin bleiben. –

+0

Das funktioniert gut, ich überprüfte ... –

+0

ich überprüfte auch..das ist was ich bekomme. Foo Typ Goo Typ Hinweis .. das ist etwas, was er nicht wollte. http://stackoverflow.com/questions/1227693/xml-array-serialization-issue-in-c –

Verwandte Themen