2012-11-24 19 views
9

値をシリアル化するとき:データに値が存在しない場合は、以下のようになります。データが存在しないときにXmlSerializerの自己終了タグを無効にする

<Note> 
     <Type>Acknowledged by PPS</Type> 
     <Data /> 
    </Note> 

しかし、私は以下の形式のXMLデータたい:私は書かれている。このため

<Note> 
     <Type>Acknowledged by PPS</Type> 
     <Data></Data> 
    </Note> 

コード:

[Serializable] 
public class Notes 
{ 
    [XmlElement("Type")] 
    public string typeName { get; set; } 

    [XmlElement("Data")] 
    public string dataValue { get; set; } 
} 

私が何をすべきかを把握することはできませんよデータに値が割り当てられていない場合は、以下の形式のデータを取得します。

<Note> 
     <Type>Acknowledged by PPS</Type> 
     <Data></Data> 
    </Note> 
+0

あなたがこれをやりたい理由がわかりませんが、あなたが書いたxmlは実際には無効です。あなたは決してデータ要素を閉じません。私はこれを使用している場合 –

+0

は[XmlElementAttribute(偽ISNULLABLE =)] は完全に私がとの違いは、実際に重要 –

+5

回が小さく、通常は直接不完全/バギーの実装に縛らしたくないことを無視します。なぜこれが欲しいのですか? –

答えて

1

IMO Serializationを使用して目的のXMLを生成することはできません。

​​

メインキャッチがin case your value is null, you should set it to empty stringである - しかし、あなたはこのような目的のスキーマを生成するためにLINQ to XMLを使用することができます。それはforce the closing tag to be generatedになります。値がnullの場合、終了タグは作成されません。

9

独自のXmlTextWriterを作成してシリアル化プロセスに渡すことで、これを行うことができます。

public class MyXmlTextWriter : XmlTextWriter 
{ 
    public MyXmlTextWriter(Stream stream) : base(stream, Encoding.UTF8) 
    { 

    } 

    public override void WriteEndElement() 
    { 
     base.WriteFullEndElement(); 
    } 
} 

あなたは使用して結果をテストすることができます。

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var stream = new MemoryStream()) 
     { 
      var serializer = new XmlSerializer(typeof(Notes)); 
      var writer = new MyXmlTextWriter(stream); 
      serializer.Serialize(writer, new Notes() { typeName = "Acknowledged by PPS", dataValue="" }); 
      var result = Encoding.UTF8.GetString(stream.ToArray()); 
      Console.WriteLine(result); 
     } 
     Console.ReadKey(); 
    } 
+0

注意:シリアル化/逆シリアル化時に 'null - > '' 'となります。 –

+1

動作しますが、各要素の後に改行なしでXMLが生成されます:( – SuperJMN

+1

@SuperJMN 'XmlWriter'を囲む必要があります。' XmlWriter'には 'Indent'を' true'に設定した 'XmlWriterSettings'と' (例えば、 'TextWriter'の代わりに' Stream'でも動作します) – domi1819

0

その場しのぎの時間 - XMLドキュメントが生成された後に子供がいない場合は、空のテキストノードを追加し、各ノードを通過する基本的Generate System.Xml.XmlDocument.OuterXml() output thats valid in HTML

を見ます

// Call with 
addSpaceToEmptyNodes(xmlDoc.FirstChild); 

private void addSpaceToEmptyNodes(XmlNode node) 
{ 
    if (node.HasChildNodes) 
    { 
     foreach (XmlNode child in node.ChildNodes) 
      addSpaceToEmptyNodes(child); 
    } 
    else   
     node.AppendChild(node.OwnerDocument.CreateTextNode("")) 
} 

(はいhouldn'tはこれをしなければならない - しかし、あなたはあなたが簡単に修正することはできませんいくつかの他のシステムにXMLを送信した場合、その後

+0

私は 'if(node (Node.HasChildNodes && node.NodeType!= XmlNodeType.Text) ' – BurnsBA

1

あなたは自動閉鎖を防ぐために、ダミーのフィールドを追加することができます)ことについて実用的でなければなりません素子。

[XmlText] 
public string datavalue= " "; 

あなたのクラスのコードが必要な場合は、あなたのクラスは次のようになります。

public class Notes 
{ 
    [XmlElement("Type")] 
    public string typeName { get; set; } 

    [XmlElement("Data")] 
    private string _dataValue; 
    public string dataValue { 
     get { 
      if(string.IsNullOrEmpty(_dataValue)) 
      return " "; 
      else 
      return _dataValue; 
     } 
     set { 
      _dataValue = value; 
     } 
    } 
} 
+0

""はまだ値です。 – Tommix

関連する問題