My suggestion is to massage the XSD file itself, since there is probably not much that can be done on the .NET side.
The following XSLT should work in your case (if the element and complex types are in the same schema file):
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsl:template match="xsd:complexType[@name]"> <xsl:if test="not(starts-with(@name, 'ArrayOf'))"> <xsl:copy> <xsl:apply-templates select="@*" /> <xsl:apply-templates /> </xsl:copy> </xsl:if> </xsl:template> <xsl:template match="xsd:element[@type]"> <xsl:variable name="typeName"> <xsl:choose> <xsl:when test="contains(@type, ':')"> <xsl:value-of select="substring-after(@type, ':')" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="@type" /> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:choose> <xsl:when test="starts-with($typeName, 'ArrayOf')"> <xsl:apply-templates select="xsd:annotation" /> <xsd:element> <xsl:copy-of select="@*[local-name(.) != 'type']" /> <xsl:comment> Inlined from <xsl:value-of select="@type" />): </xsl:comment> <xsd:complexType> <xsl:apply-templates select="//xsd:complexType[@name=$typeName]/*" /> </xsd:complexType> <xsl:comment>End of inlined element</xsl:comment> </xsd:element> <xsl:apply-templates select="xsd:attribute | xsd:attributeGroup | xsd:attributeGroup" /> </xsl:when> <xsl:otherwise> <xsl:copy> <xsl:apply-templates select="@*" /> <xsl:apply-templates /> </xsl:copy> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*" /> <xsl:apply-templates /> </xsl:copy> </xsl:template> </xsl:stylesheet>
Given this XSD input:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/ExtensionFlattener" xmlns:tns="http://www.example.org/ExtensionFlattener" elementFormDefault="qualified"> <xs:element name="SomeElement"> <xs:complexType> <xs:sequence> <xs:element name="First" type="xs:string" /> <xs:element name="Second" minOccurs="0" type="tns:ArrayOfTestArray" nillable="true"/> <xs:element name="Third" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="ArrayOfTestArray"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="array" nillable="true" type="tns:TestArray" /> </xs:sequence> </xs:complexType> <xs:complexType name="TestArray"> <xs:sequence> <xs:element name="field1" nillable="true" type="xs:dateTime" /> <xs:element name="field2" nillable="true" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:schema>
he will turn it into:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.example.org/ExtensionFlattener" targetNamespace="http://www.example.org/ExtensionFlattener" elementFormDefault="qualified"> <xs:element name="SomeElement"> <xs:complexType> <xs:sequence> <xs:element name="First" type="xs:string" /> <xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Second" minOccurs="0" nillable="true"> <xsd:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="array" nillable="true" type="tns:TestArray" /> </xs:sequence> </xsd:complexType> </xsd:element> <xs:element name="Third" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="TestArray"> <xs:sequence> <xs:element name="field1" nillable="true" type="xs:dateTime" /> <xs:element name="field2" nillable="true" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:schema>
This gives more nice Java classes (although it still gives you an additional, local, type):
@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "first", "second", "third" }) @XmlRootElement(name = "SomeElement") public class SomeElement { @XmlElement(name = "First", required = true) protected String first; @XmlElementRef(name = "Second", namespace = "http://www.example.org/ExtensionFlattener", type = JAXBElement.class) protected JAXBElement<SomeElement.Second> second; @XmlElement(name = "Third", required = true) protected String third;
Hope this applies to your problem (pun intended!)
source share