2010-11-09 3 views
3

Я разрабатываю несколько сложных классов в VB.net (но вы можете написать свой ответ на C#, если хотите: P), которые содержат данные, которые необходимо загрузить из XML. Очевидным решением является, конечно, проектирование сериализуемого класса, поэтому для автоматизации процесса загрузки.Возможно ли «смешанная» XML-сериализация в .net?

Теперь моя проблема заключается в следующем: структура 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 вручную, что я сделал для других классов, и он работает, но это также означает, что я должен читать «вручную» каждый атрибут/элемент, даже те, которые я могу легко сериализовать автоматически с помощью тегов.

Итак, наконец, мой вопрос: Можно ли использовать MIX два метода? Т.е.: автоматически сериализоваться с тегами, а затем «входить» вручную и читать вручную более «сложные» значения? (Булева просто пример, предположим, что я хочу, чтобы вручную прочитать некоторые свойства по желанию)

+0

Так у вас есть XML DTD с недопустимыми значениями? – StingyJack

+0

XML очень строгий. Если вы «xml» требует недействительного xml, то это не xml ... так что вам, вероятно, захочется, чтобы препроцессор обрабатывал проблемы и сохранял ваши * фактические * манипуляции с XML-грязью - просто – STW

+0

@StingyJack: нет, в DTD вы можете делать то, что хотите, и разработчики этого DTD (я его не проектировал) решили использовать True и False. НО стандарт XSchema, который используется для сериализации в .NET, является более строгим и допускает только «true» и «false» как допустимые логические значения. Проблема в том, что у меня уже есть XML, и он не является «неправильным» как таковым ... я должен приспособить его к моим потребностям, а в классе мне нужно логическое, поэтому я должен как-то прочитайте его как логическое, даже если для DTD это всего лишь перечислимый атрибут –

ответ

1

вы всегда можете создать private поля (или с XmlIgnore) типа bool и затем свойство, которое подвергнет его как True/False и имеет сеттер что может разобрать что-либо подобное, T/FTrue/False, Y/N и т.д.

Для общего случая вы можете создать enum.

+0

Это интересное обходное решение, спасибо за головы! Tho не отвечает на вопрос, могу ли я смешивать теги с IXMLSerializable –

+0

@Master_T, я думаю, нет.мое предложение действительно дешево и просто. Это мне очень помогло. – Andrey

+0

@Master_T: нет, вы не можете их смешивать. Я также использую свойства адаптера или перечисления. –

0

Если предложение Андрея не работает, вы можете вставить текстовый синтаксический анализатор, который «фиксирует» значения до или после операции сериализации/десериализации.

Возможного контратип XmlSerializer and OnSerializing/OnSerialized alternatives

Смежные вопросы