【问题标题】:Generate XSD file without REF elements - I just want a "literal" XSD file生成没有 REF 元素的 XSD 文件 - 我只想要一个“文字”XSD 文件
【发布时间】:2009-03-24 16:33:26
【问题描述】:

当我使用 XML 示例文件生成 XSD 时,同时使用 Visual Studio 和 Oxygen,它会生成一个使用大量 <xs:element ref="ELEMENTNAME" /> 的文件,其中 elementname 是实际的元素名称。在文件的后面,它有一个元素<xs:element name="ELEMENTNAME" type="xs:string" />,它定义了该元素是什么。例如,下面是一段摘录:

<xs:element name="Header">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="VersionNumber" /> 
      <xs:element ref="BillerGroupID" /> 
      <xs:element ref="BillerGroupShortName" /> 
      <xs:element ref="BillerID" /> 
      <xs:element ref="BillerShortName" /> 
      <xs:element ref="FileIndicator" /> 
    </xs:sequence>
  </xs:complexType>
</xs:element>
<xs:element name="VersionNumber" type="xs:string" /> 
<xs:element name="BillerGroupID" type="xs:string" /> 
<xs:element name="BillerGroupShortName" type="xs:string" /> 
<xs:element name="BillerID" type="xs:string" /> 
<xs:element name="BillerShortName" type="xs:string" /> 
<xs:element name="FileIndicator" type="xs:string" /> 

这就是问题所在 - 我正在使用 Microsoft Biztalk,它会将每个“元素”标签视为可用架构,因为它们都位于根级别 - 标题以及每个子元素。我只想让一个模式可用——在这种情况下是标题——并隐藏其余的。

显而易见的解决方案似乎是手动编辑我的文件,使其看起来像这样,手动删除 REF 语句:

<xs:element name="Header">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="VersionNumber" type="xs:string" /> 
      <xs:element name="BillerGroupID" type="xs:string" /> 
      <xs:element name="BillerGroupShortName" type="xs:string" /> 
      <xs:element name="BillerID" type="xs:string" /> 
      <xs:element name="BillerShortName" type="xs:string" /> 
      <xs:element name="FileIndicator" type="xs:string" /> 
    </xs:sequence>
  </xs:complexType>
</xs:element>

但是,由于我的文件很大并且包含数千个元素,因此这并不可行。有没有办法告诉我的工具在不使用 REF 的情况下生成文件,而只是将元素的副本放在它应该在的位置而不是根级别?

【问题讨论】:

    标签: xml visual-studio xsd biztalk


    【解决方案1】:

    如果您有 Visual Studio BizTalk 项目,您可以选择“添加生成的项目..”,然后选择“生成架构”。

    在下拉列表中选择“格式良好的 xml”,如果在您必须运行脚本激活它之前没有人使用该选项,请参见下面的链接。

    VS 现在将生成您想要的那种模式。如果 VS 猜错了,你将不得不调整数据类型:)

    查看此人的示例Add generated schemas

    【讨论】:

    • 我必须安装“格式良好的 XML”选项,但它的作用就像一个魅力,没有一个 REF。感谢您的提示!
    【解决方案2】:

    我怀疑编写一个为您执行这种转换的 XSLT 会相对容易。您可以检测 ref 属性并使用 XPath 中的值来查找真正的定义,然后将其复制到输出。应该不会很难写。

    【讨论】:

    • 我可以编写转换,但为什么工具不能首先以这种方式生成文件?我理解 REF 的意义,以防您有一个元素的多个副本,但似乎我应该能够选中一个没有它们创建文件的框。
    • 似乎您正在寻找解决其他问题的工具。您可能会在某处找到可以执行此操作的工具,但 XSLT 可能编写起来更快,这意味着您不必再添加另一个工具。
    【解决方案3】:

    您使用的是哪个版本的 VS?我在 Visual Studio 2008 中尝试了您的示例,它以您想要的方式生成了 XSD:

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="Header">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="VersionNumber" type="xs:string" />
            <xs:element name="BillerGroupID" type="xs:string" />
            <xs:element name="BillerGroupShortName" type="xs:string" />
            <xs:element name="BillerID" type="xs:string" />
            <xs:element name="BillerShortName" type="xs:string" />
            <xs:element name="FileIndicator" type="xs:string" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    看起来VS 2005 会做同样的事情。

    我查看了 VS 选项对话框,但没有看到任何可以控制如何生成 XSD 的内容。 (也许某处有配置文件?)

    【讨论】:

    • 虽然这适用于我提供的小示例,但当我在 VS2008 中运行整个 XML 文件时,它仍然会生成一个包含大量 REF 的模式。不过,谢谢你的想法!
    猜你喜欢
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多