【问题标题】:Generating C# classes from XSD从 XSD 生成 C# 类
【发布时间】:2020-01-14 04:26:24
【问题描述】:

这是我想使用 xsd 工具为 C# 生成类的 xml shema:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:b2g="http://www.carina.hr/b2g/v1.0.0#" xmlns:xadesv141="http://uri.etsi.org/01903/v1.4.1#" xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.carina.hr/b2g/v1.0.0#" elementFormDefault="qualified">
   <xsd:import namespace="http://uri.etsi.org/01903/v1.4.1#" schemaLocation="http://uri.etsi.org/01903/v1.4.1/XAdESv141.xsd" />
   <xsd:import namespace="http://uri.etsi.org/01903/v1.3.2#" schemaLocation="http://uri.etsi.org/01903/v1.3.2/XAdES.xsd" />
   <xsd:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd" />
   <element name="B2GDocument" type="b2g:B2GDocumentType" />
   <complexType name="B2GDocumentType">
      <sequence>
         <element name="RequestHeader" type="b2g:RequestHeaderType" minOccurs="1" maxOccurs="1" />
         <element name="ResponseHeader" type="b2g:ResponseHeaderType" minOccurs="0" maxOccurs="1" />
         <element name="Content" type="b2g:ContentType" minOccurs="1" maxOccurs="1" />
         <xsd:element ref="ds:Signature" minOccurs="0" maxOccurs="1" />
      </sequence>
      <attribute name="version" type="string" fixed="1.0" />
   </complexType>
   <complexType name="RequestHeaderType">
      <annotation>
         <documentation>Header of the document.</documentation>
      </annotation>
      <sequence>
         <element name="AppId">
            <annotation>
               <documentation>Id of the target application.</documentation>
            </annotation>
            <simpleType>
               <restriction base="string">
                  <whiteSpace value="collapse" />
               </restriction>
            </simpleType>
         </element>
         <element name="TraderId">
            <annotation>
               <documentation>Id of the trader.</documentation>
            </annotation>
            <simpleType>
               <restriction base="string">
                  <xsd:maxLength value="17" />
                  <whiteSpace value="collapse" />
               </restriction>
            </simpleType>
         </element>
         <element name="TraderAppId">
            <annotation>
               <documentation>Id of the trader application.</documentation>
            </annotation>
            <simpleType>
               <restriction base="string">
                  <xsd:maxLength value="48" />
                  <whiteSpace value="collapse" />
               </restriction>
            </simpleType>
         </element>
         <element name="TraderMsgId" maxOccurs="1" minOccurs="0">
            <annotation>
               <documentation>Mime type of the document.
Currently:
text/xml application/pdf</documentation>
            </annotation>
            <simpleType>
               <restriction base="string" />
            </simpleType>
         </element>
         <element name="DocUuid" type="b2g:DocUuidType" maxOccurs="1" minOccurs="0" />
      </sequence>
      <xsd:attribute name="Id" type="xsd:ID" use="required" />
   </complexType>
   <complexType name="ContentType">
      <sequence>
         <element name="DocType" type="string" maxOccurs="1" minOccurs="1" />
         <element name="MimeType" type="string" maxOccurs="1" minOccurs="1" />
         <element name="Description" type="string" maxOccurs="1" minOccurs="0">
            <annotation>
               <documentation>Opcionalni opis dokumenta. Maksimalna duljina je 255 znakova.</documentation>
            </annotation>
         </element>
         <element name="Data" maxOccurs="1" minOccurs="1">
            <xsd:complexType mixed="true">
               <xsd:sequence minOccurs="0" maxOccurs="unbounded">
                  <xsd:any namespace="##any" processContents="lax" />
               </xsd:sequence>
               <xsd:attribute name="encoding" use="required">
                  <simpleType>
                     <restriction base="string">
                        <enumeration value="EMBEDDED" />
                        <enumeration value="BASE64" />
                     </restriction>
                  </simpleType>
               </xsd:attribute>
               <xsd:anyAttribute namespace="##any" />
            </xsd:complexType>
         </element>
      </sequence>
      <xsd:attribute name="Id" type="xsd:ID" use="required" />
   </complexType>
   <complexType name="ResponseHeaderType">
      <sequence>
         <element name="DocUuid" type="b2g:DocUuidType" />
         <element name="ReceiveTimestamp" type="dateTime" />
      </sequence>
      <xsd:attribute name="Id" type="xsd:ID" use="required" />
   </complexType>
   <xsd:simpleType name="DocUuidType">
      <xsd:restriction base="xsd:string">
         <xsd:length value="36" />
         <xsd:pattern value="[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}" />
      </xsd:restriction>
   </xsd:simpleType>
</schema>

当我尝试使用

生成类时
C:\test>xsd G2BDokument.xsd /Classes

我收到这条消息:

Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 2.0.50727.3038]
Copyright (C) Microsoft Corporation. All rights reserved.
Schema validation warning: The 'http://www.w3.org/2000/09/xmldsig#:Signature' element is not declared. Line 20, position 11.

Warning: Schema could not be validated. Class generation may fail or may produce incorrect results.

Error: Error generating classes for schema 'G2BDokument'.
  - The element 'http://www.w3.org/2000/09/xmldsig#:Signature' is missing.

If you would like more help, please type "xsd /?".

我无法弄清楚我做错了什么,所以任何人都可以帮助我吗? 谢谢!

【问题讨论】:

  • 您可以发布您用来生成 XSD 的 XML 文件吗?
  • 我没有 xml 文件。我只有一些项目文档中的这个 xsd。

标签: c# xsd


【解决方案1】:

如果你有这个文件“xmldsig-core-schema.xsd”,试试这个:

C:\test>xsd G2BDokument.xsd xmldsig-core-schema.xsd /Classes

BR

【讨论】:

    【解决方案2】:

    我做了类似的事情,所以:你必须传递 2 个参数。您的文件和http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd 参考。由于 XSD.exe 只接受 1 个输入参数,因此您必须将其传递给 .Xsd 路径。

    所以,你必须这样做:

    1. 下载 xmldsig-core-schema.xsd 架构。
    2. 运行这个:

      "C:\Program Files\Microsoft SDKs\Windows\vXXXX\bin\xsd.exe" [path_your_folder]\your_file.xsd [path_to_your_folder]\xmldsig-core-schema.xsd /c /n:mi_new_class_file_name /l:VB

    新文件“mi_new_class_file_name.vb”现在可能位于您的“C:\Program Files\Microsoft SDKs\Windows\vXXXX\bin”文件夹中。

    【讨论】:

      【解决方案3】:

      感谢它工作正常。

      你能解释一下 nologo 和 class 的区别吗

      e.x C:\test>xsd G2BDokument.xsd xmldsig-core-schema.xsd /Classes

      C:\test>xsd G2BDokument.xsd xmldsig-core-schema.xsd /nologo 
      

      【讨论】:

      • 使用 nologo,不会显示此信息:Microsoft (R) Xml Schemas/DataTypes support utility [Microsoft (R) .NET Framework,版本 4.0.30319.33440] 版权所有 (C) Microsoft Corporation。保留所有权利。
      【解决方案4】:

      几天前我遇到了类似的问题。就我而言,是正在构建有问题的 XML 文件的客户端。一段时间后,我决定简化我的方法。这可能不是最佳做法,但最终它奏效了:

      我有 2 个 XSD:一个带有对签名的引用,另一个没有它。由于是客户来签署 XML 文件,所以我给了 XSD 没有参考他。他创建了类,然后是 XML,然后对其进行签名并将其发送给我。然后我使用另一个 XSD(有参考的那个)来检查一致性。

      事情似乎奏效了。 正如我所说,它不是最漂亮的,但它确实能胜任呵呵。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-16
        相关资源
        最近更新 更多