【问题标题】:Why does XSD.EXE Create Two .XSD Files, and How to Use Them?为什么 XSD.EXE 会创建两个 .XSD 文件,以及如何使用它们?
【发布时间】:2009-07-05 13:33:46
【问题描述】:

我正在使用以下命令从我的输入 XML 文件中生成相关的 xsd 文件——response.xml,我的困惑是(1)为什么有两个 xsd 文件输出(response.xsd 和 response_app1.xsd),我想应该只生成其中一个? (2) 如果我需要使用 xsd /classes 生成 C# 类文件,我应该使用哪个 xsd 文件?

我的环境:VSTS 2008 + C# + .Net 3.5。

D:\>xsd response.xml
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 2.0.50727.3038]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'D:\response.xsd'.

这是我的输入 XML 文件和输出 XSD 文件,

http://www.mediafire.com/file/kzzoxw0zwgq/inputoutput.zip

编辑 1:

当我执行xsd response.xsd生成相关C#类时,出现错误信息,这里是详细输出,

D:\>xsd response.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.mycorp.com/Order/2009/05/mex:Items' e
lement is not declared. Line 10, position 16.

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

Error: Error generating classes for schema 'response'.
  - The element 'http://www.mycorp.com/Order/2009/05/mex:Items' is missing.

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

提前致谢, 乔治

【问题讨论】:

    标签: c# .net xml xsd


    【解决方案1】:

    乔治,

    要从这些文件中生成类,您必须在命令行中列出两者:

    D:\>xsd response.xsd response_app1.xsd /classes 
    

    已经正确地说这两个 .xsd 文件是因为您的原始 XML 文件中有两个 XML 命名空间。顺便说一句,我在这里猜测了一下,因为您没有发布 XML 文件。

    【讨论】:

    • 谢谢,为什么生成的xsd文件除了一个之外还有两个?以及这两个文件的不同功能是什么?
    • 顺便说一句:您的解决方案有效。对我的上述问题有任何想法或想法吗? :-)
    【解决方案2】:

    生成两个文件的原因是您的 XML 包含两个 XML 命名空间;每个生成的 XSD 对应一个命名空间。用于soap 信封命名空间的那个会导入mycorp 命名空间(您可以从xs:import 元素中看到)。

    【讨论】:

    • 我的困惑是,为什么一个 XSD 文件只能包含一个命名空间?
    • 虽然其他命名空间是在您的 XML 文档中声明的,但实际上并没有元素使用它们。
    • 在回答您的第一个问题时,XML 命名空间通常映射到并标识一个模式。 XSD 工具的作用是有道理的。你确定你需要为整个事情生成一个模式吗? SOAP 信封模式已定义 (w3.org/TR/2000/NOTE-SOAP-20000508/envelope-2000-04-18.xml)。您可能只想在包含 SOAP 有效负载的文档上运行 XSD。
    • 1.是的。 2. 不同的命名空间通常意味着不同的应用程序。例如,XHTML 可以通过使用不同的名称空间来包含 MATHML。但是,由于它们是独立存在的,因此 XML 模式定义文件包含两者是没有意义的。
    • 我的意思是 XML 命名空间可以独立存在,因此它们通常位于单独的 XSD 中。对于您生成的架构,它们是相关的,因此将一个导入另一个。整个单独的 XSD 只是工具创建者做出的文件组织选择。
    【解决方案3】:

    IIRC,你同时使用,一个可能会引用另一个。

    【讨论】:

    • @leppie, 1. 当我执行 xsd response.xsd 生成相关的C#类时,有错误信息。我已经在我原来的帖子编辑 1 部分中发布了。有什么想法有什么问题吗? 2.“一个可能会引用另一个”——你如何证明这一点?
    【解决方案4】:

    是的,从 XML 文件中删除命名空间并生成它,您将得到单个 XSD 文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      • 2011-07-04
      相关资源
      最近更新 更多