2010-11-09 101 views
3

我正在設計VB.net中的一些複雜類(但您可以在C#中編寫您的答案,如果您願意:P),其中包含必須從XML加載的數據。當然,顯而易見的解決方案是設計一個可序列化的類,以便自動化加載過程。是否可以在.net中執行「混合」XML序列化?

現在,我的問題如下:XML結構是固定的,我不能改變它,它有一些令人討厭的序列化。下面是一小片的DTD,更好地說明問題的例子:

<!ELEMENT Relationship (AttributePairs | AscendCaption | DescendCaption | ErrPreventInsertOrUpdateChild | ErrPreventDeleteParent | ErrPreventUpdateParent |ExtendedProperties |HiddenProperties)* > 
<!ATTLIST Relationship 

    CountAggregates CDATA #IMPLIED 
    CountReplicates CDATA #IMPLIED 
    OnParentUpdate (PreventIfChildren|UpdateChildren) #IMPLIED 
    OnParentDelete (PreventIfChildren|DeleteChildren|NullChildrenForeignKey) #IMPLIED 
    IsEnforce (True|False) #REQUIRED 
    OnChildInsertOrUpdate (PreventIfNoParent|InsertParentIfNone) #IMPLIED 
    ChildRoleName CDATA #IMPLIED 
    ParentRoleName CDATA #IMPLIED 
    ParentAttributeGroupInstance CDATA #IMPLIED 
    ChildAttributeGroupInstance CDATA #IMPLIED 

> 

<!--Lots of other sutff not needed for this example --> 

正如你可以看到,上述所有屬性可以很容易地通過剛剛宣佈了相應的屬性,並與<XmlAttribute()>標籤裝飾它序列化。 不測:

IsEnforce(TRUE | FALSE)#REQUIRED

由於真假不在XML(由於資本T與F)與序列化進程將無法有效的布爾值。

現在...我知道的唯一的其他選擇是手動實現IXMLSerializable,這是我爲其他類所做的工作,但它也意味着我必須手動讀取每個屬性/元素,即使是那些我可以輕鬆地用標籤自動序列化的。

所以,最後,我的問題:是否有可能混合這兩種方法?即:自動序列化與標籤,然後「步入」手動讀取更「棘手」的價值觀? (布爾只是一個例子,假設我想手動讀取隨意某些屬性)bool

+0

可能欺騙所以,你必須與非法值的XML DTD? – StingyJack 2010-11-09 21:20:43

+0

XML非常嚴格。如果你是「xml」需要無效的xml,那麼它不是xml ...所以你可能會想要一個預處理器來處理這些問題,並保持你的* actual * XML操作很簡單 – STW 2010-11-09 21:26:16

+0

@StingyJack:nope,in DTD你可以做你想做的事,那個DTD的設計者(我沒有設計它)決定使用True和False。但是在.NET中用於序列化的XSchema標準更加嚴格,只允許「真」和「假」作爲有效的布爾值。 這裏的問題是我已經有了XML,並且它本身不是「不正確的」......關鍵是我必須適應它以滿足我的需求,並且在類中我需要一個布爾值,所以我必須以某種方式閱讀它作爲布爾值,即使對於DTD它只是一個枚舉屬性 – 2010-11-09 21:30:24

回答

1

你總是可以創建private場(或XmlIgnore),然後屬性,將其公開爲True/False,並有一個setter可以解析任何東西,如T/F,True/False,Y/N等。

對於一般情況下,您可以創建enum

+0

這是一個有趣的解決方法,謝謝你的支持!它不回答我是否可以混合標籤與IXMLSerializable – 2010-11-09 21:11:26

+0

@Master_T我猜不。我的建議非常便宜和簡單。這對我幫助很大。 – Andrey 2010-11-09 21:18:40

+0

@Master_T:不,你不能混用它們。我也使用適配器屬性或枚舉。 – 2010-11-09 21:37:35

相關問題