2009-09-14 18 views
11

Çok ayrıntılı bir xml dosyasına sahibim. Visual Studio 2008 komut istemini kullanarak bir xsd dosyası oluşturdukXSD tarafından oluşturulan sınıflara XML Deserialization ile sorun

<?xml version="1.0" encoding="UTF-8"?> 
<config> 
    <Models>...</Models> 
    <Data>...</Data> 
</config> 

: Aşağıda (Ben alt düzey düğümler olarak elips dahil ettik her şey iyi oluşur ve düzgün veri ile dolu) üst düzey düğümleri geçerli:

xsd sample.xml 

Bu, yalnızca xsd dosyasını oluşturur. Ben yardımcı sınıfında okuma işlevini kullanıyorum bir sınıf nesnesine xml dosyasının serisini kaldırma için

xsd sample.xsd /classes 

: Sonra oto komutuyla xsd gelen sınıfları oluşturmak

public class XmlSerializerHelper<T> 
{ 
    public Type _type; 

    public XmlSerializerHelper() 
    { 
     _type = typeof(T); 
    } 

    public void Save(string path, object obj) 
    { 
     using (TextWriter textWriter = new StreamWriter(path)) 
     { 
      XmlSerializer serializer = new XmlSerializer(_type); 
      serializer.Serialize(textWriter, obj); 
     } 
    } 

    public T Read(string path) 
    { 
     T result; 
     using (TextReader textReader = new StreamReader(path)) 
     { 
      XmlSerializer deserializer = new XmlSerializer(_type); 
      result = (T)deserializer.Deserialize(textReader); 
     } 
     return result; 
    } 
} 

ile deserialization çalışırken:

var helper = new XmlSerializerHelper<configModels>(); 
var obj = new configModels(); 
obj = helper.Read(filepath); 

ben deserializer 'Models' düğümü ancak ilgili sınıf adıydı generat aradığı çünkü tesbit etmişlerdir bir hata alırsınız Kök düğüm ve 'Model' düğümü (configModels) birleşimi olarak. Sınıf isimleri neden böyle üretiliyor?

Maalesef
var helper = new XmlSerializerHelper<config>(); 
var obj = new config(); 
obj = helper.Read(filepath); 

, bu sonuçlar aşağıdaki gibi hatalar ile ilgili bir takım içinde:

System.InvalidOperationException was unhandled by user code 
Message="Unable to generate a temporary class (result=1). 
error CS0030: Cannot convert type 'Application.Lease[]' to 'Application.Lease' 
error CS0030: Cannot convert type 'Application.CashFlow[]' to 'Application.CashFlow' 
...ect. 

birileri doğru beni yönlendirmek Can ne olabilir

kullanıyorum üst düğümden serisini çalıştı xsd otomatik üretmemde yanlış mı yapıyorsun?

+0

Otomatik araçların hiçbiri doğru kodu üretmez. El ile xml için nesne kodunu yazdırarak seri hale getirdim. –

+0

Marc_s'ın cevabını, problemini çözdüğünü söylediğinden beri işaretleyebilir misin? – Win

cevap

3

xsd.exe ve listeleri ile ilgili bir sorun var. Oluşturulan sınıfa girmeli ve dosyayı doğru tipte el ile düzenlemelisiniz. Xsd2Code kullanmaya geçtim. Şimdiye kadar bu soruna sahip görünmüyor.

+0

Xsd2Code'u denedim ve bu da bana listelerle aynı dönüştürme hatalarını veriyor. –

+0

xsd dosyasını otomatik olarak oluşturmak için xsd.exe kullanmamalı mıyım? –

+0

Sadece iyi kullanabilirsiniz. Sadece oluşturulan sınıfa girip el ile düzenlemelisiniz. Ancak, Xsd2Code da sorun yaşadıysa, @marc_s ile aynı fikirdeyim; Muhtemelen xml şemanızda soruna neden olan bir şey var. –

10

XSD.EXE iyi bir başlangıçtır - ancak mükemmel olmaktan uzaktır. Ayrıca, sağladığınız XML'e dayanarak, XSD.EXE her zaman bir nesnenin tek bir örneği mi yoksa açık uçlu nesneler mi olduğuna karar veremez.

Bu, iki öğeniz için geçerli gibi görünüyor - Application.Lease ve Application.CashFlow. Oluşturulan XSD dosyasında nasıl tanımlanır? Bu sana mantıklı geliyor mu? Büyük olasılıkla, aşağıdaki gibi biraz ipuçları eklemek zorundayız: İsteğe bağlı özellik için

<xs:element name="Lease" minOccurs="0" maxOccurs="1" /> 

, sadece sıfır veya bir tekrar sonrasında bu. Böyle bir şey sadece xsd.exe aracı için sadece tek bir XML örnek dosyasına dayanarak anlamaya zor.

Marc

+1

Marc, paranın tam karşılığı var, çözümün benim için problemi çözdü. Hatalı elemanlar üzerindeki minOccurs ve maxOccurs değerlerini el ile güncelleştirerek, sınıflarımı oluşturmak için XSD2CODE'yi çalıştırıyorum bu sorunu benim için çözdü. – ProNotion

10

Oluşturulan sınıfa git ve tüm değiştirmek gelen [] [] ---> []

+0

Bu, sorunu çözecek olsa da, marc_s'ın yanıtı bunun neden gerekli olduğunu ve bunu yapmaktan nasıl sakınılması gerektiğini açıklamaktadır. – MyItchyChin

0

bu sorunun etiketleri arasında xml dosyası içeriği (yani olmasıdır neden olabilir diğer konu içerik), olmaması gerektiğinde hala kodlanmıştır. Örneğin, içeriğimde bulunan <br> etiketi &lt;br /&gt; yerine <br> idi. Xsd jeneratörü bunları şemadaki elemanlara dönüştürdü, sonra birden fazla bulunduğundan, onları sınırsız olarak etiketledi.Bunları kodlamayanlar sorunu çözdüler ve sınıfları doğru bir şekilde oluşturdular.

İlgili konular