2012-11-24 32 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是不可能的。但是,你可以使用LINQ to XML產生這樣所需要的模式 -

​​

主要的缺點是in case your value is null, you should set it to empty string。它會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 - >「」''。 – 2012-11-24 11:12:30

+1

可以工作,但是在每個元素之後生成的XML沒有換行符: – SuperJMN

+1

@SuperJMN您需要環繞一個'XmlWriter',底層'XmlWriter'需要''Indent''設置爲'true'的'XmlWriterSettings',例如:http://pastebin.com/G2bZNQnQ(也可以使用'Stream'而不是'TextWriter') – domi1819

0

未完善的時間 - 看見Generate System.Xml.XmlDocument.OuterXml() output thats valid in HTML

後基本上XML文檔已經產生經過的每個節點,加上如果沒有孩子一個空的文本節點

// 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("")) 
} 

(是的,我知道你的不必這樣做 - 但是如果您將XML發送到其他系統,而您不能輕鬆修復,那麼必須務實些)

+0

我不得不改變'if(node .HasChildNodes)'to'if(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