I am trying to create a class from a xsd file using the XSD.EXE tool. but for some reason i get this error.
Warning: cannot generate classes because no top-level elements with complex type were found.
I have looked around on stack and seen that i could put a type on the complex type element but i cannot seem to get i to work. here is the xsd file
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader"
xmlns="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:complexType name="DocumentIdentification">
<xs:sequence>
<xs:element name="Standard" type="xs:string"/>
<xs:element name="TypeVersion" type="xs:string"/>
<xs:element name="InstanceIdentifier" type="xs:string"/>
<xs:element name="Type" type="xs:string"/>
<xs:element name="MultipleType" type="xs:boolean" minOccurs="0"/>
<xs:element name="CreationDateAndTime" type="xs:dateTime"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
Thanks!
You XSD only defines a type (as Sergio also suggested). As such, it cannot be used for validation of XML, unless it is imported by another XSD . Likewise, other tools like xsd.exe
will not be able to anything sensible with it.
You can compare this with a C# library having an interface definition, but no implementation of the interface.
You can fix this in a variety of ways. Considering your current code, I would suggest something along those lines:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader"
xmlns="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:complexType name="DocumentIdentification">
<xs:sequence>
<xs:element name="Standard" type="xs:string" />
<xs:element name="TypeVersion" type="xs:string" />
<xs:element name="InstanceIdentifier" type="xs:string" />
<xs:element name="Type" type="xs:string" />
<xs:element name="MultipleType" type="xs:boolean" minOccurs="0" />
<xs:element name="CreationDateAndTime" type="xs:dateTime" />
</xs:sequence>
</xs:complexType>
<xs:element name="DocumentIdentification" type="DocumentIdentification" />
</xs:schema>
Though you may consider renaming the type name, to prevent confusion to readers. A common pattern is to suffix typenames with Type
, in your case, DocumentIdentificationType
.
The code above is importable with xsd.exe
without any problems.
It would be better to use SvcUtil.exe instead of xsd.exe. It will allow you to avoid the problem with generating classes based on types-only XSDs. An example of .bat file:
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 Tools\SvcUtil.exe MySchema.xsd TypesSchema.xsd /dconly /n:*,MyNamespace
pause
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With