2009-08-04 9 views
8

Ich verwende VSTS2008 + C# + .Net 3.0. Ich verwende unten Code, um XML zu serialisieren, und mein Objekt enthält Array-Typ-Eigenschaft, aber dort einige zusätzliche Elemente Ebene (in meinem Beispiel, MyInnerObject und MyObject) generiert, die ich aus der generierten XML-Datei entfernen möchte. Irgendwelche Ideen?Wrapper-Elemente aus dem XML-serialisierten Array entfernen

Aktuelle generierte XML-Datei,

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

Expected XML-Datei,

<?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> 
    </MyObjectProperty> 
</MyClass> 

Aktuelle Code,

public class MyClass 
{ 
    private MyObject[] _myObjectProperty; 

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

    [XmlArrayItemAttribute(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[1]; 
     instance.MyObjectProperty[0].MyInnerObjectProperty[0] = new MyInnerObject(); 
     instance.MyObjectProperty[0].MyInnerObjectProperty[0].ObjectName = "Foo Type"; 
     s.Serialize(fs, instance); 

     return; 
    } 
} 

Antwort

14

Statt

[XmlArrayItemAttribute] 

Verwendung:

[XmlElement] 

dies in der Zukunft Um herauszufinden, können Sie (von einer VS-Eingabeaufforderung) ausgeführt werden:

xsd.exe test.xml 
xsd.exe /classes test.xsd 

Diese Test.cs erzeugt, dass die XML-serializable Klasse enthält, basierend auf dem XML. Dies funktioniert sogar noch besser, wenn Sie eine .xsd natürlich haben

+0

Dank Sander, funktioniert Ihre Lösung. Können Sie etwas mehr darüber beschreiben, warum die Verwendung von XmlArrayItemAttribute Auswirkungen auf das Ergebnis-XML hat? Und warum XmlElement funktioniert? – George2

+2

Es gibt nur einen Unterschied darin, dass Sie beide XML-Darstellungen verwenden können, XmlElement überspringt den Eigenschaftsnamen und gibt nur Elemente aus, XmlArrayItem erstellt ein Array (benannt mit dem Eigenschaftsnamen) von Elementen (benannt mit dem von Ihnen angegebenen Namen) –

+0

Danke Sander , Frage beantwortet. Ich habe eine weitere Frage hier, zu schätzen, wenn Sie helfen könnten, http://StackOverflow.com/Questions/1227897/Adding-an-Additional-Layer-To-XML-Serialization-result-for-an-array – George2

Verwandte Themen