65.9K
CodeProject 正在变化。 阅读更多。
Home

.NET8 中的 XSD 工具 – 第 1 部分 – VS2022

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2024 年 9 月 21 日

CPOL

6分钟阅读

viewsIcon

4522

downloadIcon

103

.NET8 环境中可用的 XSD 工具实用指南。

1 在 .NET8 中进行 XML 和 XSD 相关工作

我最近在 .NET8 环境中进行了一些与 XML 和 XSD 处理相关的工作,并创建了几个 概念验证 应用程序来评估可用的工具。这些文章是我 原型设计工作的结果。

 

1.1 使用/测试的工具列表

以下是使用/测试的工具

  • Visual Studio 2022
  • XSD.EXE(微软许可,VS2022 的一部分)
  • XmlSchemaClassGenerator (开源/免费软件)
  • LinqToXsdCore (开源/免费软件)
  • Liquid XML Objects (商业许可)

 

1.2 本系列文章

由于技术原因,我将把这篇文章组织成几篇文章

  • .NET8 中的 XSD 工具 – 第 1 部分 – VS2022
  • .NET8 中的 XSD 工具 – 第 2 部分 – C# 验证
  • .NET8 中的 XSD 工具 – 第 3 部分 – XsdExe – 简单
  • .NET8 中的 XSD 工具 – 第 4 部分 – XsdExe - 高级
  • .NET8 中的 XSD 工具 – 第 5 部分 – XmlSchemaClassGenerator – 简单
  • .NET8 中的 XSD 工具 – 第 6 部分 – XmlSchemaClassGenerator – 高级
  • .NET8 中的 XSD 工具 – 第 7 部分 – LinqToXsdCore – 简单
  • .NET8 中的 XSD 工具 – 第 8 部分 – LinqToXsdCore – 高级
  • .NET8 中的 XSD 工具 – 第 9 部分 – LiquidXMLObjects – 简单
  • .NET8 中的 XSD 工具 – 第 10 部分 – LiquidXMLObjects – 高级

 

2 XML 术语

以下是对一些 XML 术语的复习

  • XML - 可扩展标记语言 (XML) 是一种用于存储、传输和重建任意数据的标记语言和文件格式。
  • 格式良好的 XML - XML 中的格式良好的文档是指“遵守 XML 1.0 规范中规定的语法规则,必须同时满足物理和逻辑结构”的文档。
  • XSD schema 文件 - XML Schema 定义 (XSD) 是一个框架文档,它定义了 XML 文档的规则和约束。XSD 正式描述了 XML 文档中的元素,并可用于验证 XML 文档的内容,以确保其符合 XSD 的规则。
  • DTD - 文档类型定义 (DTD) 是一个规范文件,包含一组标记声明,用于定义 SGML 家族标记语言 (GML, SGML, XML, HTML) 的文档类型。DTD 规范文件可用于验证文档。
  • 有效的 XML - “有效”的 XML 文档必须格式良好。此外,它必须符合文档类型定义。XML 可以使用两种不同的文档类型定义:1) DTD - 原始文档类型定义;2) XML Schema - DTD 的基于 XML 的替代方案。
  • XML 验证 – 这是一个根据特定的 DTD 或 XSD 文件确定 XML 是否有效的过程。

 

所以,我的想法是。我们有各种各样的文本文件。然后有些文本文件是标记语言文件。那些旨在传输或保存数据并遵循 XML 1.0 规范的文件称为 XML 文件,或者更准确地说,“格式良好的 XML”文件。那些不是“格式良好的 XML”文件的文件,实际上根本不是 XML,它们是“看起来像 XML”的。“它们看起来像 XML,但严格来说并不符合 XML 1.0 规范的定义。

然后,在所有 XML 文件中,我们想要定义一个具有特定结构的 XML 系列。我们可以通过 DTD 文件或 XSD 文件来表达这些 schema 规则。我认为这些规则就像 XML 文件必须满足的语法。在一个称为“XML 验证”的过程中,我们检查某个特定的 XML 是否满足 DTD 或 XSD 给出的规则。如果满足,我们就说该特定的“XML 根据给定的 DTD 或 XSD 有效”。

 

3 Visual Studio 2022 的 XML 和 XSD 工具

3.1 XML 和 XSD 的基本操作

VS2022 提供了一些非常有用的功能来操作 XML 和 XSD 文件

  • 创建 XML 和 XSD 文件
  • 为 XML 自动创建 XSD schema(最佳猜测算法)
  • 根据某个 XSD schema 验证 XML
  • 多个 XSD 设计视图
  • 为某个定义的 XSD schema 生成示例(随机)XML

 

3.2 基本操作 GUI

以下屏幕截图可以帮助用户在 VS2022 中找到上述操作。

 

 

 

4 关于 XML 和 XSD 规则的更多理论

这里有更多关于 XML 和 XSD 规则的理论。

4.1 可选的 Xml-Element 和 Xml-Attribute

可选:XML 中不需要存在。

对于 XSD Schema 元素
可选:minOccurs="0" 属性 ->要将 Schema 元素设置为可选,请包含 minOccurs="0" 属性。

 

4.2 Xml-Element 和 Xml-Attribute 的可选与非必需的区别

注意区别

  • 可选:XML 中不需要存在。
  • 非必需:不需要有值。

 

您可以进行任何组合

  • 可选 + 非必需
  • 可选 + 必需
  • 非可选 + 非必需
  • 非可选 + 必需

 

对于 XSD Schema 元素

  • 可选:minOccurs="0" 属性 ->要将 Schema 元素设置为可选,请包含 minOccurs="0" 属性。
  • 必需:nillable="true" 属性 ->要将 Schema 元素设置为非必需,请包含 nillable="true" 属性。

 

字符串数据类型默认是非必需的,但您可以强制它们成为必需的。
其他数据类型,例如布尔型、整数型、日期型、时间型等,默认都是必需的。要使这些数据类型中的一个非必需,您必须在 Schema 中为该元素设置 nillable 属性等于 true。

 

5 XML 和 XSD 的示例

结合以上所有关于 XML 和 XSD 的理论,这里有一些我使用 VS2022 工具集为测试目的创建的示例 XML 和 XSD。

5.1 简单案例

请注意,此示例 XML/XSD 包含一个 可选的 Xml-Element。有关更多详细信息,请阅读其中的注释。

 

<?xml version="1.0" encoding="utf-8"?>
<!--SmallCompanyAAA.xml+++++++++++++++++++++++++++++++++++++++++++++++-->
<SmallCompany xmlns="https://markpelf.com/SmallCompany.xsd">
    <CompanyName>SmallCompanyAAA</CompanyName>
    <Employee>
        <Name_String_NO>Mark</Name_String_NO>
        <City_String_O>Belgrade</City_String_O>
    </Employee>
    <Employee>
        <Name_String_NO>John</Name_String_NO>
    </Employee>
    <InfoData>
        <Id_Int_NO>11</Id_Int_NO>
        <Quantity_Int_O>123</Quantity_Int_O>
    </InfoData>
    <InfoData>
        <Id_Int_NO>22</Id_Int_NO>
    </InfoData>
</SmallCompany>

 

<?xml version="1.0" encoding="utf-8"?>
<!--SmallCompany.xsd++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<xs:schema attributeFormDefault="unqualified" 
           elementFormDefault="qualified" 
           targetNamespace="https://markpelf.com/SmallCompany.xsd" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="SmallCompany">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="CompanyName" type="xs:string" />
                <xs:element maxOccurs="unbounded" name="Employee">
                    <xs:complexType>
                        <xs:sequence>
                            <!--Name_String_NO is String NotOptional-->
                            <xs:element name="Name_String_NO" type="xs:string" />
                            <!--City_String_O is String Optional-->
                            <xs:element minOccurs="0" name="City_String_O" type="xs:string" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element maxOccurs="unbounded" name="InfoData">
                    <xs:complexType>
                        <xs:sequence>
                            <!--Id_Int_NO is Int NotOptional-->
                            <xs:element name="Id_Int_NO" type="xs:int" />
                            <!--Quantity_Int_O is Int Optional-->
                            <xs:element minOccurs="0" name="Quantity_Int_O" type="xs:int" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

 

5.2 高级案例

请注意,此示例 XML/XSD 包含一个 可选且非必需的 Xml-Element。请阅读其中的注释以获取更多详细信息。

 

<?xml version="1.0" encoding="utf-8"?>
<!--BigCompanyMMM.xml+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<BigCompany xmlns="https://markpelf.com/BigCompany.xsd">
    <CompanyName>BigCompanyMMM</CompanyName>
    <Employee>
        <Name_String_NO>Mark</Name_String_NO>
        <City_String_O>Belgrade</City_String_O>
    </Employee>
    <Employee>
        <Name_String_NO>John</Name_String_NO>
    </Employee>
    <InfoData>
        <Data1_Int_NO_R>555</Data1_Int_NO_R>
        <Data2_Int_NO_NR>16</Data2_Int_NO_NR>
        <Data3_Int_O_R>333</Data3_Int_O_R>
        <Data4_Int_O_NR>17</Data4_Int_O_NR>
    </InfoData>
    <InfoData>
        <Data1_Int_NO_R>123</Data1_Int_NO_R>
        <Data2_Int_NO_NR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />
        <Data3_Int_O_R>15</Data3_Int_O_R>
        <Data4_Int_O_NR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />
    </InfoData>
    <InfoData>
        <Data1_Int_NO_R>777</Data1_Int_NO_R>
        <Data2_Int_NO_NR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />
    </InfoData>
</BigCompany>

 

<?xml version="1.0" encoding="utf-8"?>
<!--BigCompany.xsd+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           attributeFormDefault="unqualified" 
           elementFormDefault="qualified" 
           targetNamespace="https://markpelf.com/BigCompany.xsd" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="BigCompany">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="CompanyName" type="xs:string" />
                <xs:element maxOccurs="unbounded" name="Employee">
                    <xs:complexType>
                        <xs:sequence>
                            <!--Name_String_NO is String NotOptional-->
                            <xs:element name="Name_String_NO" type="xs:string" />
                            <!--City_String_O is String Optional-->
                            <xs:element minOccurs="0" name="City_String_O" type="xs:string" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element maxOccurs="unbounded" name="InfoData">
                    <xs:complexType>
                        <xs:sequence>
                            <!--Data1_Int_NO_R is Int NotOptional+Required-->
                            <xs:element name="Data1_Int_NO_R" type="xs:int" minOccurs="1" nillable="false" />
                            <!--Data2_Int_NO_NR is Int NotOptional+NotRequired-->
                            <xs:element name="Data2_Int_NO_NR" type="xs:int" minOccurs="1" nillable="true" />
                            <!--Data3_Int_O_R is Int Optional+Required-->
                            <xs:element name="Data3_Int_O_R" type="xs:int" minOccurs="0" nillable="false" />
                            <!--Data4_Int_O_NR is Int Optional+NotRequired-->
                            <xs:element name="Data4_Int_O_NR" type="xs:int" minOccurs="0" nillable="true" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

 

6 参考资料

 

[1] 格式良好的文档
https://en.wikipedia.org/wiki/Well-formed_document

[2] XML Schema
https://w3schools.org.cn/xml/xml_schema.asp

[3] XML Schema 教程
https://w3schools.org.cn/xml/schema_intro.asp

[4] XML 命名空间
https://w3schools.org.cn/xml/xml_namespaces.asp

[21] .NET8 中的 XSD 工具 – 第 1 部分 – VS2022
https://codeproject.org.cn/Articles/5388391/XSD-Tools-in-NET8-Part1-VS2022

[22] XSD 工具在 .NET8 中 – 第 2 部分 – C# 验证
https://codeproject.org.cn/Articles/5388393/XSD-Tools-in-NET8-Part2-Csharp-validation

[23] XSD 工具在 .NET8 中 – 第 3 部分 – XsdExe – 简单
https://codeproject.org.cn/Articles/5388396/XSD-Tools-in-NET8-Part3-XsdExe-Simple

[24] XSD 工具在 .NET8 中 – 第 4 部分 – XsdExe - 高级
https://codeproject.org.cn/Articles/5388483/XSD-Tools-in-NET8-Part4-XsdExe-Advanced

[25] XSD 工具在 .NET8 中 – 第 5 部分 – XmlSchemaClassGenerator – 简单
https://codeproject.org.cn/Articles/5388548/XSD-Tools-in-NET8-Part5-XmlSchemaClassGenerator-Si

[26] XSD 工具在 .NET8 中 – 第 6 部分 – XmlSchemaClassGenerator – 高级
https://codeproject.org.cn/Articles/5388549/XSD-Tools-in-NET8-Part6-XmlSchemaClassGenerator-Ad

[27] XSD 工具在 .NET8 中 – 第 7 部分 – LinqToXsdCore – 简单
https://codeproject.org.cn/Articles/5388628/XSD-Tools-in-NET8-Part7-LinqToXsdCore-Simple

[28] XSD 工具在 .NET8 中 – 第 8 部分 – LinqToXsdCore – 高级
https://codeproject.org.cn/Articles/5388629/XSD-Tools-in-NET8-Part8-LinqToXsdCore-Advanced

[29] XSD 工具在 .NET8 中 – 第 9 部分 – LiquidXMLObjects – 简单
https://codeproject.org.cn/Articles/5388683/XSD-Tools-in-NET8-Part9-LiquidXMLObjects-Simple

[30] XSD 工具在 .NET8 中 – 第 10 部分 – LiquidXMLObjects – 高级
https://codeproject.org.cn/Articles/5388684/XSD-Tools-in-NET8-Part10-LiquidXMLObjects-Advanced

 

© . All rights reserved.