5

.NET 4.0で.NETのDataContractSerializerを使用してXMLに変換する一連のクラスがあります。シリアライゼーションは正常に動作しており、XMLを解析して後で.NETオブジェクトを後で再作成することはできます。.Net DataContractSerializerで "http://www.w3.org/2001/XMLSchema-instance"名前空間を使用しないようにする

ただし、ほとんどのDataMemberは必須ではありません。 [DataMember(IsRequired = false)]。これはXMLのデシリアライズに効果的です。XMLノードをドキュメントから逃すことはできますが、既存のオブジェクトをXMLにシリアル化するとき、DataContractSerializerはnull値を属性として持つノードとしてプロパティを書き出すことを主張します。

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

} 

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

からシリアライズすることができ、私はオブジェクトをシリアライズしかし、もし、それが作成されます。

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

を代わりにノードを記述しないようにDataContractSerializerを取得する方法はあります、それはnull値を持っていますか?

+0

。 –

+0

よく斑点を付けました...カットアンドペーストで何かが間違っていました... –

答えて

10

使用EmitDefaultValue = false XMLのデフォルト値をスキップする:

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

次の例のようたとえばReplace()用に関して

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

を使用する必要がxmlns:i="http://www.w3.org/2001/XmlSchema-instance"を削除する:)

+0

私のために働きました。ありがとう。 – TravisWhidden

+4

それを削除するための 'String.Replace'はハックのようです。より良い選択肢がありますか? –

0

(私は間違った質問でこの回答を誤って掲載しましたが、ここでも役に立つと思いますので、私はそれを削除しません今すぐ)

[DataContract(Namespace = "")] 

各クラスの上には、それがもっといいです。 datacontract名前空間と醜いノード接頭辞を削除します。ただし、標準名前空間はそのままです。それは私の場合は大丈夫でした。

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

後::前

あなたはあなたの例を残し

<?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> 
関連する問題