2009-08-04 20 views
8

VSTS2008 + C# + .NET 3.0 kullanıyorum. XML'i serileştirmek için aşağıdaki kodu kullanıyorum ve nesneyim dizi tipi özelliği içeriyor, ancak oluşturulan XML dosyasından kaldırmak istediğim bazı ek öğeler katmanı (örneğimde, MyInnerObject ve MyObject) oluşturuldu. Herhangi bir fikir?XML-Seri hale getirilmiş Diziden Sarmalayıcı Öğelerini Kaldırma

Güncel oluşturulan XML dosyası,

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

Beklenen XML dosyası,

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

Güncel kodu,

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

cevap

14

yerine

[XmlArrayItemAttribute] 

kullanım:

[XmlElement] 

(VS komut isteminden) gelecek, Çalıştırabileceğiniz içinde bu anlamaya için: Bu Test.cs üretir

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

, xml seri hale getirilebilir sınıfını içerir, xml tabanlı.

+0

Thanks Sander'ın çevresinde bir .xsd varsa, daha iyi çalışır. Çözümünüz çalışır. XmlArrayItemAttribute'un neden XML'yi etkilediğini biraz daha açıklayabilir misiniz? Ve neden XmlElement çalışır? – George2

+2

Sadece xml gösterimlerini kullanmanıza izin veren, XmlElement öğesinin adını atladığını ve yalnızca çıktı öğelerini kullanabildiğiniz bir fark vardır. XmlArrayItem öğelerin (propertyname ile adlandırılmış) bir dizi oluşturur (sağladığınız adla adlandırılır) –

+0

Teşekkürler Sander , soru cevaplandı. Burada başka bir sorum var, yardımcı olabilirseniz teşekkür ederiz, http://stackoverflow.com/questions/1227897/adding-an-adeli-layer-to-xml-serialization-result-for-an-array – George2

İlgili konular