13

DatacontractSerializerを使用して、domainModelをxmlファイルにシリアル化しています。 私は以下のような出力を得ています。DataContractSerializer XML出力の "d1p1"名前空間接頭辞を削除します。

<z:anyType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="1" xmlns:d1p1="DCSerialization_IGITApproach" i:type="d1p1:X" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"> 
    <d1p1:Name z:Id="2">Ankit</d1p1:Name> 
    <d1p1:PointsDictionary xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" z:Id="3" z:Size="1"> 
    <d2p1:KeyValueOfstringPointsArrayq9VX7VJJ> 
     <d2p1:Key z:Id="4">key1</d2p1:Key> 
     <d2p1:Value xmlns:d4p1="http://schemas.datacontract.org/2004/07/SerializationApproach" z:Id="5"> 
     <d4p1:points z:Id="6" z:Size="2"> 
      <d2p1:double>45.5</d2p1:double> 
      <d2p1:double>546.45</d2p1:double> 
     </d4p1:points> 
     </d2p1:Value> 
    </d2p1:KeyValueOfstringPointsArrayq9VX7VJJ> 
    </d1p1:PointsDictionary> 
</z:anyType> 

は、そして私は、これらの「d1p1」の名前空間接頭辞を取り除きたいだけタグの代わりに、</d1p1:PointsDictionary>よう</PointDictionary>をしたいです。 クラスプロパティにDataMember属性を入れてみましたが、問題の多くは解決しません。 出力XMLファイルはエンドユーザが編集できるので、上記のXMLファイルと比較してよりクリーンなXMLファイルが必要です。

最初の優先順位はコードのみで制御し、可能でない場合はXSLTまたは他のスキーマを使用することです。

+0

ようこそStackOverflow:コード、XML、またはデータサンプルを投稿する場合は、**これらの行をテキストエディタで強調表示し、エディタツールバーの[コードサンプル]ボタン( '{}')をクリックしてくださいフォーマットと構文はそれを強調する! –

答えて

3

DataContractSerializerはプレフィックスをあまり制御できません。 XML Serialization and namespace prefixesへの答えは、名前空間接頭辞を制御したい場合はXmlSerializerを使用することを示唆しています。

あなたのドメインモデルの名前空間接頭辞を完全に削除するかどうかについての質問は明確ではありません。上記のサンプルには、d1p1、d2p1、d4p1という名前空間接頭辞がいくつかあります。 Changing namespace for XML file in XSL Translationは、XSLTを使用したプレフィックスの名前変更に関するガイダンスを提供しています。

+5

XmlSerializerには、DataContractSerializerと比べて2つの制限があります。インターフェイスを処理しないため、すべてのクラスにパラメータのないコンストラクタが必要です。私は、DataContractSerializerを使用し、名前空間の問題を扱ういくつかの他の方法を見つけるために、より良い長期的なソリューションと信じています。 – Contango

+0

@Contango、私は原則として同意します。ただし、 'DataContractSerializer' *(私の経験上)ではパラメータのないコンストラクタが必要です。私はそれを持っていない型でそれをインスタンス化しようとすると、ランタイムエラーが発生します。 – harpo

+0

@harpo DataContractSerializerには空のコンストラクタは必要ありません。あなたは何かを間違ってやっている。あなたが新しい質問にあなたのコードを掲載したいのであれば、私はそれを見直すことができます。 – Dan

5

空の名前空間を使用すると、接頭辞が削除されているようです。次のDataContract属性でセットアップクラス:次に

[DataContract(Namespace="")] 
public class MyClass 
{ ... } 

シリアライズするとき(デ)空の文字列に名前空間を設定してください:

DataContractSerializer deserializer = new DataContractSerializer(typeof(MyClass), typeof(MyClass).Name, ""); 
0

あなたはこれらの接頭辞を取り除くことができるはずですXMLにシリアライズしようとしているクラスが同じ名前空間内にあることを確認するだけです。例えば、私は2つのクラスのApplicationListResponseとApplicationを持っていました。以前は、名前空間はModels.ResponsesとModels.Responses.Applicationでした。私は両方の名前空間を「モデル」に変更し、XML出力の接頭辞を取り除いた。

関連する問題