2009-07-22 76 views
6

我有一個非常具體的反序列化的需要,見下面的例子:.NET XmlSerializer類是否可以將InnerXml反序列化爲字符串?

說我有以下類:

[Serializable]
public class Person {
public string Name { get; set; }
public string PersonXml { get; set; }
}

和下面的XML

 
<Person> 
    <Name>John</Name> 
    <PersonXml><someXmlFragment>text</someXmlFragment></PersonXml> 
</Person> 

我要的是XmlSerializer類以PersonXml屬性將PersonXml >元素的InnerXml反序列化爲字符串。 我想知道是否可以做到。

注: 我知道我可以編碼的<PersonXml>內容逃脫非法XML字符,但我寧願離開內XML更加人性化友好(不含& LT;和其他實體只會cofuse我結束用戶)

回答

3

您可以隨時執行IXmlSerializable並通過XmlReader做任何您想象的事情。

+0

好吧,我不認爲這樣的路徑。 這肯定會解決我的問題,雖然我希望有更便宜的解決方案:) 謝謝! – 2009-07-22 15:42:43

+0

順便說一句,你不需要用於XML序列化的[Serializable]。 [XmlElemenht(「Name」)]也可以省略,因爲在這種情況下它不會改變XMLSerializer的默認行爲。 – 2009-07-22 17:33:53

1

因此,即使該元素實際上包含XML元素,你希望.NET假裝它真的是一個字符串?我認爲這不可能通過標準的序列化。

但是,您可以加載XML,轉換PersonXml並正確轉義它,然後用新轉義的數據替換PersonXml的內容。它將涉及在反序列化XML之前手動操作XML,但是您可以將XML元素保留在PersonXml下。

+0

啊,但是這似乎對我來說,太多的麻煩和一個漂亮的醜陋的解決方案:) – 2009-07-22 15:36:27

0

爲什麼不使用XML來表示XML? PersonXml只需使用XmlElement

假裝XML與String是同一件事總是一個壞主意。

0

的職位是老了,但我一直在尋找一個解決方案,也許我的回答能幫助別人。

什麼

[XmlText] 
public string PersonXml { get; set; } 

這不會解決你的問題,但也許它可能是一個可以接受的選擇。

在我的情況下PersonXml是一個「很好的到了元」,這並不總是包含XML。當PersonXml包含Xml時,[XmlText]導致PersonXml爲空。但是,當PersonXml包含沒有Xml的文本時,反序列化是正確的。

在我的情況,而不[XMLTEXT]在PersonXml在Xml導致元件之前PersonXml被正確反序列化但PersonXml後元件被不正確地反序列化。

0

我尋找類似的解決方案時,我難住這個答案。不想使用IXmlSerializable。

所以,以供參考,如果有人正在尋找在未來的這個問題,你可以使用XmlAnyElement屬性序列內XML作爲XmlNode的。然後,您可以根據需要發佈XmlNode進程,分別運行序列化或根據需要獲取xml文本。

對於這個例子:

public class Person 
{ 

    public string Name { get; set; } 

    [XmlAnyElement] 
    public XmlNode PersonXml { get; set; } 

} 
相關問題