2010-11-09 67 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

相关问题