Reputation: 11
I have having trouble extracting attributes along with their names and datatypes and datatype length from XSD file.
My XSD file is of the following structure. There are basically 3 columns in this XSD (Action_needed,Company id,Company Name). From this XSD I need to extract the column names, their datatypes and the maxlength of the datatype. I need to use C# for this.
Would appreciate any inputs regarding this. Thanks in advance. I tried many blogs/posts in this forum but could not figure this out.
<xs:element name="Companies">
<xs:complexType>
<xs:sequence>
<xs:element ref="Z" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Z">
<xs:complexType>
<xs:attribute ref="c1"/>
<xs:attribute ref="c2" use="required" />
<xs:attribute ref="c3" use="required" />
</xs:complexType>
</xs:element>
<xs:attribute name="c1">
<xs:annotation>
<xs:appinfo>Action_needed</xs:appinfo>
<xs:documentation>Action (Add/Update/Delete)</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="A"/>
<xs:enumeration value="U"/>
<xs:enumeration value="D"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="c2">
<xs:annotation>
<xs:appinfo>Company ID</xs:appinfo>
<xs:documentation>My Suppliers > Supplier Header > Name</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="sqltypes:int"/>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="c3">
<xs:annotation>
<xs:appinfo>Company Name</xs:appinfo>
<xs:documentation>My Suppliers > Supplier Header > Name</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="sqltypes:nvarchar">
<xs:maxLength value="255"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:schema>
Upvotes: 1
Views: 2884
Reputation: 4638
If you got a xsd document like above, you may need a code like that.
here is a console version
my xsd file
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="transfer">
<xs:complexType>
<xs:sequence>
<xs:element name="sourceGLN" type="xs:string" minOccurs="1" maxOccurs="1" />
<xs:element name="actionType" minOccurs="1" maxOccurs="1">
<xs:element name="destinationGLN" type="xs:string" minOccurs="1" maxOccurs="1" />
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="P" /> <!-- Mal Alim (Purchase) -->
<xs:enumeration value="S" /> <!-- Satis (Sale) -->
<xs:enumeration value="C" /> <!-- Cancel Sale (Cancel) -->
<xs:enumeration value="R" /> <!-- Iade (Return) -->
<xs:enumeration value="D" /> <!-- Deaktivasyon (Deactivation) -->
<xs:enumeration value="M" /> <!-- Uretim (Manufacture) -->
<xs:enumeration value="I" /> <!-- Ithalat (Import) -->
<xs:enumeration value="X" /> <!-- Ihrac (eXport) -->
<xs:enumeration value="O" /> <!-- Sarf (cOnsume) -->
<xs:enumeration value="N" /> <!-- Bilgi (iNformation) -->
<xs:enumeration value="T" /> <!-- Devir (Transfer) -->
<xs:enumeration value="L" /> <!-- Devir Iptal (canceL Transfer) -->
<xs:enumeration value="F" /> <!-- Aktarim (non-its transFer) -->
<xs:enumeration value="K" /> <!-- Aktarim Iptal (non-its cancel transfer) -->
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="shipTo" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="documentNumber" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="documentDate" type="xs:date" minOccurs="0" maxOccurs="1" />
<xs:element name="note" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="version" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="carrier" type="carrierType" minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="carrierType">
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:choice minOccurs="1" maxOccurs="1">
<xs:element name="productList" type="productListType" minOccurs="1" maxOccurs="1" />
<xs:element name="carrier" type="carrierType" minOccurs="1" maxOccurs="1" />
</xs:choice>
</xs:sequence>
<xs:attribute name="carrierLabel" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="20" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="containerType" type="xs:string" use="optional" />
</xs:complexType>
<xs:complexType name="productListType">
<xs:sequence>
<xs:element name="serialNumber" type="xs:string" minOccurs="1" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="GTIN" type="xs:string" use="required" />
<xs:attribute name="lotNumber" type="xs:string" use="required" />
<xs:attribute name="productionDate" type="xs:date" use="optional" />
<xs:attribute name="expirationDate" type="xs:date" use="required" />
<xs:attribute name="PONumber" type="xs:string" use="optional" />
</xs:complexType>
</xs:schema>
and here is my c# code for this :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Schema;
using System.Collections;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
private static void Main(string[] args)
{
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.ValidationEventHandler += new ValidationEventHandler(ValidationCallback);
schemaSet.Add("http://www.w3.org/2001/XMLSchema", "C:\\Chandan\\myxsdfile.xsd");
schemaSet.Compile();
XmlSchema xmlSchema = null;
foreach (XmlSchema schema in schemaSet.Schemas())
{
xmlSchema = schema;
}
DataSet myDS = new DataSet();
myDS.ReadXmlSchema("C:\\Chandan\\myxsdfile.xsd");
foreach (object item in xmlSchema.Items)
{
XmlSchemaElement schemaElement = item as XmlSchemaElement;
XmlSchemaComplexType complexType = item as XmlSchemaComplexType;
if (schemaElement != null)
{
Console.Out.WriteLine("Schema Element: {0}", schemaElement.Name);
XmlSchemaType schemaType = schemaElement.SchemaType;
XmlSchemaComplexType schemaComplexType = schemaType as XmlSchemaComplexType;
if (schemaComplexType != null)
{
XmlSchemaParticle particle = schemaComplexType.Particle;
XmlSchemaSequence sequence = particle as XmlSchemaSequence;
if (sequence != null)
{
foreach (XmlSchemaElement childElement in sequence.Items)
{
Console.Out.WriteLine(" Element/Type: {0}:{1}", childElement.Name,
childElement.SchemaTypeName.Name);
}
}
if (schemaComplexType.AttributeUses.Count > 0)
{
IDictionaryEnumerator enumerator = schemaComplexType.AttributeUses.GetEnumerator();
while (enumerator.MoveNext())
{
XmlSchemaAttribute attribute = (XmlSchemaAttribute)enumerator.Value;
Console.Out.WriteLine(" Attribute/Type: {0}", attribute.Name);
}
}
}
}
else if (complexType != null)
{
Console.Out.WriteLine("Complex Type: {0}", complexType.Name);
OutputElements(complexType.Particle);
if (complexType.AttributeUses.Count > 0)
{
IDictionaryEnumerator enumerator = complexType.AttributeUses.GetEnumerator();
while (enumerator.MoveNext())
{
XmlSchemaAttribute attribute = (XmlSchemaAttribute)enumerator.Value;
Console.Out.WriteLine(" Attribute/Type: {0}", attribute.Name);
}
}
}
Console.Out.WriteLine();
}
Console.Out.WriteLine();
Console.In.ReadLine();
}
private static void OutputElements(XmlSchemaParticle particle)
{
XmlSchemaSequence sequence = particle as XmlSchemaSequence;
XmlSchemaChoice choice = particle as XmlSchemaChoice;
XmlSchemaAll all = particle as XmlSchemaAll;
if (sequence != null)
{
Console.Out.WriteLine(" Sequence");
for (int i = 0; i < sequence.Items.Count; i++)
{
XmlSchemaElement childElement = sequence.Items[i] as XmlSchemaElement;
XmlSchemaSequence innerSequence = sequence.Items[i] as XmlSchemaSequence;
XmlSchemaChoice innerChoice = sequence.Items[i] as XmlSchemaChoice;
XmlSchemaAll innerAll = sequence.Items[i] as XmlSchemaAll;
if (childElement != null)
{
Console.Out.WriteLine(" Element/Type: {0}:{1}", childElement.Name,
childElement.SchemaTypeName.Name);
}
else OutputElements(sequence.Items[i] as XmlSchemaParticle);
}
}
else if (choice != null)
{
Console.Out.WriteLine(" Choice");
for (int i = 0; i < choice.Items.Count; i++)
{
XmlSchemaElement childElement = choice.Items[i] as XmlSchemaElement;
XmlSchemaSequence innerSequence = choice.Items[i] as XmlSchemaSequence;
XmlSchemaChoice innerChoice = choice.Items[i] as XmlSchemaChoice;
XmlSchemaAll innerAll = choice.Items[i] as XmlSchemaAll;
if (childElement != null)
{
Console.Out.WriteLine(" Element/Type: {0}:{1}", childElement.Name,
childElement.SchemaTypeName.Name);
}
else OutputElements(choice.Items[i] as XmlSchemaParticle);
}
Console.Out.WriteLine();
}
else if (all != null)
{
Console.Out.WriteLine(" All");
for (int i = 0; i < all.Items.Count; i++)
{
XmlSchemaElement childElement = all.Items[i] as XmlSchemaElement;
XmlSchemaSequence innerSequence = all.Items[i] as XmlSchemaSequence;
XmlSchemaChoice innerChoice = all.Items[i] as XmlSchemaChoice;
XmlSchemaAll innerAll = all.Items[i] as XmlSchemaAll;
if (childElement != null)
{
Console.Out.WriteLine(" Element/Type: {0}:{1}", childElement.Name,
childElement.SchemaTypeName.Name);
}
else OutputElements(all.Items[i] as XmlSchemaParticle);
}
Console.Out.WriteLine();
}
}
static void ValidationCallback(object sender, ValidationEventArgs args)
{
if (args.Severity == XmlSeverityType.Warning)
Console.Write("WARNING: ");
else if (args.Severity == XmlSeverityType.Error)
Console.Write("ERROR: ");
Console.WriteLine(args.Message);
}
}
}
Upvotes: 1