5

ile kullanmaktan kaçınarak .NET 4.0'da .NET'in DataContractSerializer'ı kullanarak XML'e dönüştürdüğüm bir dizi dersim var. Serileştirme gayet iyi çalışıyor ve XML'i ayrıştırabilir ve .NET nesnelerini herhangi bir zorluk olmadan daha sonra yeniden oluşturabilirim."http://www.w3.org/2001/XMLSchema-instance" ad alanını .Net DataContractSerializer

Ancak, DataMember'lerin çoğu gerekli değildir. [DataMember (IsRequired = false)]. Bu, XML düğümünü serileştirmek için harikadır, burada XML düğümünü belgeden çıkarırsınız, ancak bir XML nesnesine bir exisiting nesnesini serileştirirken, DataContractSerializer bir özniteliği olan düğümler olarak boş değerlere sahip olan özellikleri yazmakta ısrar eder.

<response xmlns="http://domain.com/name" xmlns:i="http://www.w3.org/2001/XmlSchema-instance"> 
    <count>4</count> 
    <info i:nil="true" /> 
    <metadata i:nil="true" /> 
</response> 

yerine düğümü yazmayın için DataContractSerializer almak için herhangi bir yolu var mı:
[DataContract(Name = "response", Namespace = "http://domain.com/name")] 
public class MyResponseClass 
{ 
    [DataMember(Name = "count", IsRequired = true, Order = 0)] 
    public int Count { get; set; } 

    [DataMember(Name = "info", IsRequired = false, Order = 1)] 
    public InfoClass Info { get; set; } 

    [DataMember(Name = "metadata", IsRequired = false, Order = 2)] 
    public MetadataList Metadatas { get; set; } 

} 

Ben nesneyi tefrika halinde oluşturduğu, ancak

<response xmlns="http://domain.com/name"> 
    <count>4</count> 
</response> 

den serileştirilebilir , null değeri olduğunda?

+0

Sen örneğini bıraktı. –

+0

İyi fark ettim ... Kesim ve yapıştırmayla ilgili bir şeyler ters gitti ... –

cevap

10

Kullanım EmitDefaultValue = false XML varsayılan değerleri atlamak:

[DataContract(Name = "response", Namespace = "http://domain.com/name")] 
public class MyResponseClass 
{ 
    [DataMember(Name = "count", IsRequired = true, Order = 0, EmitDefaultValue = false)] 
    public int Count { get; set; } 

    [DataMember(Name = "info", IsRequired = false, Order = 1, EmitDefaultValue = false)] 
    public InfoClass Info { get; set; } 

    [DataMember(Name = "metadata", IsRequired = false, Order = 2, EmitDefaultValue = false)] 
    public MetadataList Metadatas { get; set; } 
} 

aşağıdaki örnekte açısından

public void Write(string filePath, MyResponseClass myResponse) 
{ 
    var serializer = new DataContractSerializer(typeof(MyResponseClass)); 

    var sb = new StringBuilder(); 
    using (var writer = new StringWriter(sb)) 
    using (var xmlWriter = XmlWriter.Create(writer)) 
    { 
     serializer.WriteObject(xmlWriter, myResponse); 
    } 

    using (StreamWriter stream = new StreamWriter(filePath)) 
    { 
     sb = sb.Replace(" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"", ""); 
     stream.Write(sb); 
    } 
} 

gibi örneğin Replace() için kullanmak zorunda xmlns:i="http://www.w3.org/2001/XmlSchema-instance" kaldırmak için :)

+0

Benim için çalıştı. Teşekkürler. – TravisWhidden

+4

'String.Replace' kaldırmak için bir kesmek gibi görünüyor. Daha iyi bir seçenek var mı? –

0

(Bu cevabı yanlışlıkla yanlış soruya yolladım, ama bence burada da yardımcı oluyor, bu yüzden onu silmiyorum Her bir sınıfın üstünde, her bir sınıfın daha iyi olmasını sağlayan

. Veri sözleşmesi ad alanlarını ve çirkin düğüm öneklerini kaldırır. Ancak, standart ad alanı kalır. Bu benim davam için tamam oldu.

önce:

<?xml version="1.0" encoding="utf-8"?> 
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://schemas.datacontract.org/2004/07/MyClassname"> 
    <prop1>true</prop1> 
    <prop2 xmlns:d2p1="http://schemas.datacontract.org/2004/07/MySubclassname"> 
    <d2p1:sub>true</d2p1:sub> 
    </prop2> 
</root> 

sonra:

<?xml version="1.0" encoding="utf-8"?> 
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <prop1>true</prop1> 
    <prop2> 
    <sub>true</sub> 
    </prop2> 
</root> 
İlgili konular