生成没有REF元素的XSD文件 - 我只想要一个“文字”XSD文件

时间:2009-03-24 16:33:27

标签: xml visual-studio xsd biztalk

当我使用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,它将每个“Element”标记视为可用模式,因为它们都在根级别 - 标题以及每个子元素。我只想制作一个架构 - 在这种情况下为Header - 并隐藏其余部分。

显而易见的解决方案似乎是手动编辑我的文件,看起来像这样,手动删除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的情况下生成文件,而只是将元素的副本放在应该位于根级别的位置?

3 个答案:

答案 0 :(得分:3)

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

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

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

查看此人的样本Add generated schemas

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您使用的是哪个版本的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生成方式的内容。 (也许某处有配置文件?)