สร้าง C# Class จาก XSD ไฟล์

สร้าง C# Class จาก XSD ไฟล์

เริ่มจากใช้ CMD Prompt ของ Visual Studio คือ Developer Command Prompt

เดาว่าน่าจะมีการ set path มาครบถ้วน ซึ่งจะทำให้ใช้งาน utilities ได้ดีกว่า มั้ง

ทีนี้ เราก็สามารถใช้ XSD ในการ convert XSD ไฟล์ ให้กลายเป็น Class file

C:\Program Files\Microsoft Visual Studio\2022\Community>xsd
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 4.8.3928.0]
Copyright (C) Microsoft Corporation. All rights reserved.

xsd.exe -
    Utility to generate schema or class files from given source.

xsd.exe <schema>.xsd /classes|dataset [/e:] [/l:] [/n:] [/o:] [/s] [/uri:]
xsd.exe <assembly>.dll|.exe [/outputdir:] [/type: [...]]
xsd.exe <instance>.xml [/outputdir:]
xsd.exe <schema>.xdr [/outputdir:]

     - OPTIONS -

/classes
    Generate classes for this schema. Short form is '/c'.

/dataset
    Generate sub-classed DataSet for this schema. Short form is '/d'.

/enableLinqDataSet
    Generate LINQ-enabled sub-classed Dataset for the schemas provided.  Short form is '/eld'.

/element:<element>
    Element from schema to process. Short form is '/e:'.

/fields
    Generate fields instead of properties. Short form is '/f'.

/order
    Generate explicit order identifiers on all particle members.

/enableDataBinding
    Implement INotifyPropertyChanged interface on all generated types
    to enable data binding. Short form is '/edb'.

/language:<language>
    The language to use for the generated code. Choose from 'CS', 'VB', 'JS',
    'VJS', 'CPP' or provide a fully-qualified name for a class implementing
    System.CodeDom.Compiler.CodeDomProvider. The default language
    is 'CS' (CSharp). Short form is '/l:'.

/namespace:<namespace>
    The namespace for generated class files. The default namespace
    is the global namespace. Short form is '/n:'.

/nologo
    Suppresses the banner.

/out:<directoryName>
    The output directory to create files in. The default
    is the current directory. Short form is '/o:'.

/type:<type>
    Type from assembly to generate schema for. Multiple types may be provided.
    If no types are provided, then schemas for all types in an assembly
    are generated. Short form is '/t:'.

/uri:<uri>
    Uri of elements from schema to process. Short form is '/u:'.

     - ADVANCED -

/parameters:<file>
    Read command-line options from the specified xml file. Short form is '/p:'.

     - ARGUMENTS -
<schema>.xsd       Name of a schema containing elements to import.
<assembly>.dll|exe Name of an assembly containing types to generate schema for.
<instance>.xml     Name of an xml file to infer xsd schema from.
<schema>.xdr       Name of an xdr schema to convert to xsd.
Multiple file arguments of the same type may be provided.

C:\Program Files\Microsoft Visual Studio\2022\Community>

และนี่คือ class ที่ได้

ถ้าไฟล์ XSD Basic ล่ะก็ วิธีนี้ดีเลย รวดเร็วมาก

แต่ถ้า XSD มัน Advance มากๆ เราต้องตรวจสอบ แล้วก็แก้ไขไฟล์ที่ได้

ซึ่งก็ค่อนข้างยุ่งยากเลยทีเดียว

ปัญหา #1 การจัดกลุ่ม หรือลำดับ?

ปรกติแล้ว เหมือนว่าไฟล์ที่ได้จากการใช้ XSD-gen สร้างขึ้นมา มันมักจะใช้งาน <xsd:sequence> เป็นหลัก ซึ่ง sequence มันจะคิดว่า Element ที่อยู่ภายในจะต้องเรียงลำดับตามที่กำหนด โดยเราสามารถระบูได้ว่า มันเรียงอย่างไร แต่ละการเรียง มันจะมีโอกาสเกิดได้กี่ครั้ง ซึ่งส่วนนี้ XSD-gen น่าจะต้องทำผิด ไม่มากก็น้อย เพราะ XML file ที่ป้อนให้ XSD-gen ไม่น่าจะครอบคลุมทุก case อยู่แล้ว

ทีนี้ถ้าเราต้องการเปลี่ยน การจัดกลุ่ม หรือจัดลำดับในลักษณะนี้ เราก็ต้องเปลี่ยน keyword นี้หน่อย

ใน XSD มีตัวกำหนดการจัดกลุ่ม (Compositor) อยู่ 3 แบบหลักๆ คือ:

  • <xsd:sequence> (ลำดับ): Element ลูกทั้งหมด ต้อง ปรากฏตามลำดับที่กำหนดไว้เท่านั้น
  • <xsd:all> (ทั้งหมด): Element ลูกทั้งหมด สามารถ ปรากฏในลำดับใดก็ได้ (สลับกันได้)
  • <xsd:choice> (ตัวเลือก): สามารถมี Element ลูกได้ เพียงตัวเดียว จากรายการที่กำหนด

ซึ่งทั้ง 3 แบบ มันมีข้อจำกัดของมันอยู่

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *