Десериализация содержимого сложного элемента в строку с помощью XmlSerializer в C#

Есть ли способ десериализовать элементы, содержащие либо простой текст, либо вложенный элемент в строку с помощью XmlSerializer?

XML-образец:

<Attribute>
    <AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">thisistext</AttributeValue>
    <AttributeValue>
        <e:Authorities xmlns:e="urn:dummy">
            <e:Authority>ORG_CHIEF</esia-encoder:Authority>
        </e:Authorities>
    </AttributeValue>
</Attribute>

Свойство С#:

[XmlElement("AttributeValue", IsNullable = true)]
public string[] AttributeValue { get; set; }

Десериализация первого AttributeValue завершается успешно, но следующая завершается ошибкой. Неудивительно, потому что метод ReadElementString ожидает простое или пустое содержимое. Я ищу способ сообщить сериализатору «поместить содержимое этого элемента в строку, что бы он ни содержал».


person artplastika    schedule 16.01.2013    source источник


Ответы (2)


На самом деле, второе значение в вашем XML:

 <e:Authorities xmlns:e="urn:dummy">
     <e:Authority>ORG_CHIEF</esia-encoder:Authority>
 </e:Authorities>

Это недопустимый string тип данных, который ожидается из-за:

public string[] AttributeValue {get; set;}
person Myrtle    schedule 16.01.2013
comment
Я хочу получить второе значение (xml разметка элемента Authorities) в виде строки. - person artplastika; 16.01.2013
comment
@artplastika Тогда ваш класс не является представлением XML-документа. Это потребует от вас реализации интерфейса IXmlSerializable для пользовательской (де)сериализации класса. - person Myrtle; 16.01.2013
comment
Ваш совет с IXmlSerializable имелся в виду по умолчанию, я искал решение на основе метаданных. Но поскольку другого способа сделать это нет, я принимаю это как ответ. :) - person artplastika; 17.01.2013

Если вы можете определить его в XSD, вы можете использовать XSD2Code или xsd.exe, чтобы создать класс для XSD для десериализации.

Что насчет этого?

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="Attribute">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="AttributeValue" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:choice>
                            <xs:element name="AuthoritiesString" type="xs:string"/>
                            <xs:element name="AuthoritiesElement">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="Authority"/>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:choice>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
person StampedeXV    schedule 16.01.2013