When you generate a class out of a schema with an element configured to allow mixed content (child attributes and elements as well as text), you should expect the corresponding generated field type to be a string array;
So – if you have a schema that looks like this
<?xml version=”1.0″ encoding=”utf-8″?>
<xs:schema targetNamespace=”http://tempuri.org/XMLSchema.xsd” elementFormDefault=”qualified” xmlns=”http://tempuri.org/XMLSchema.xsd” xmlns:mstns=”http://tempuri.org/XMLSchema.xsd”
xmlns:xs=”http://www.w3.org/2001/XMLSchema”>
<xs:element name=”SomeElement”>
<xs:complexType mixed=”true”>
<xs:sequence>
<xs:element name=”Child1″ type=”xs:string”/>
<xs:element name=”Child2″ type=”xs:string”/>
<xs:element name=”Child3″ type=”xs:string”/>
</xs:sequence>
<xs:attribute name=”SomeAttribute” type=”xs:string”/>
</xs:complexType>
</xs:element>
</xs:schema>
(not ’SomeElement’ being a complex type allowing mixed content)
The fields in the generated class would look like
public partial class SomeElement { private string child1Field; private string child2Field; private string child3Field; private string[] textField; private string someAttributeField; . . .
The reason is that an XML corresponding to the schema might look like this –
<SomeElement xmlns="http://tempuri.org/XMLSchema.xsd" SomeAttribute="someAttributeValue"> Some free text <Child1>Child1 text</Child1> Some more free text <Child2>Child2 text</Child2> yet some more free text <Child3>Child3 text</Child3> </SomeElement>
And so by using a string array to hold the text the deserialiser can keep string portion separately.
Initially, I thought, this allows the structure to represent the original xml accurately, but this is not exactly the case – you would still not know for certain where each string portion existed, especially if in the source XML you get a few elements that don’t have text between them, which , I suspect, is why when I serialise the instance back to xml I actually get –
<?xml version="1.0"?> <SomeElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" SomeAttribute="someAttributeValue" xmlns="http://tempuri.org/XMLSchema.xsd"> <Child1>Child1 text</Child1> <Child2>Child2 text</Child2> <Child3>Child3 text</Child3> Some free text Some more free text yet some more free text </SomeElement>
Now, I don’t particularly like this sort of xml, and shy away from mixed content; I don’t believe that xml snippets like my samples above are useful, specifically I don’t think that mixing elements and text is particularly nice.
However, consider an element with an attribute and some text – the following is quite reasonable I think, and yet requires mixed content –
<Phone type=”mobile”>some text here</Phone>