2014-09-23 73 views
2

我有一個可以包含文本或xml,text + xml或text + xml + text的節點。前兩種情況下,我已經解決了使用XmlSerializer - 包含文本+ xml +文本的節點

但是,最後一種情況下,在XML文本後我找不到解決方案。

XML

<node> 
somtext <p>moretext</p> even more text 
</node> 

我的代碼會給輸出文本爲:

sometext <p>moretext</p> 

我需要:

sometext <p>moretext</p> even more text 
+0

端注:如果你的節點會包含不正確的語法XML?它會讓你的主要xml不正確。 – Reniuz 2014-09-23 12:59:02

+0

的確如此,但之後一切都會失敗。 – ruffen 2014-09-23 13:01:30

回答

3

你想要什麼稱爲混合內容,並在XmlSerializer中受支持。

寫你的類像這樣

[Serializable] 
public class TestClass 
{ 
    [XmlText(typeof(string))] 
    [XmlAnyElement] 
    public object[] Items { get; set; } 
} 

,並把所有的元素相同的對象數組中

+0

不錯!這個工作就像一個魅力一樣。 。 – ruffen 2014-09-24 07:34:38

0

你必須使用CDATA - 因爲標籤< >將打破XML結構使用CDATA或編碼你[R字符串(也許B64)

到這裏看看:

how-do-you-serialize-a-string-as-cdata-using-xmlserializer

編輯:

我想以後你的代碼應該是這個樣子:

[XmlIgnore] 
    public string OtherXML; 

    [XmlText] 
    [XmlElement(ElementName = "OtherXML")] 
    XmlCDataSection OtherXMLAsCdata 
    { 
     get 
     { 
      var dummy = new XmlDocument(); 
      return dummy.CreateCDataSection(OtherXML); 
     } 
     set 
     { 
      if (value == null) 
      { 
       OtherXML = null; 
       return; 
      } 

      OtherXML = value.Value; 
     } 
    } 
+0

假設這涉及在序列化之前更改XML? (添加cdata元素) – ruffen 2014-09-23 13:13:26

+0

@ruffen看看編輯 - 你的InnerText是我的OtherXML – Cadburry 2014-09-23 13:32:20

+0

嘗試過,但在我的單元測試中得到空字符串,XmlElementAttribute中的ElementName是否與XML中必須存在的東西相對應? – ruffen 2014-09-23 13:38:55

相關問題