【问题标题】:Creating an XSD schema创建 XSD 架构
【发布时间】:2010-03-10 10:56:21
【问题描述】:

我有一个 xml 标签:

<ROW field1="value 1"  field2="value 2" ...  />

fieldi有一个字符串值,fieldi的属性个数是可变的,但不小于1。是否可以为这个标签创建一个xsd schema?

可能的xml文档

<ROWDATA>
  <ROW field1="dfgdf" field2="ddfg"></ROW>
  <ROW field1="dfedf" field2="djkfg" field3="cdffd"></ROW>
  <ROW field1="dfedf" field2="djkfg" field3="cdffd" field4="dfedf" field5="djkfg" field6="cdffd"></ROW>
</ROWDATA> 

在我从 Web 服务器收到的这个 xml 文档中,可以是可变数量的属性字段(我将它们记为 fieldi,其中 i 表示特定属性字段的顺序) 所以我有,未知数量的 ROW 元素和未知数量的 ROW 元素中的字段属性

谢谢

【问题讨论】:

    标签: c# xml xsd xsd.exe


    【解决方案1】:

    如果您使用的是 Visual Studio 2008:

    • 在 Visual Studio 中打开您的 Xml 文件
    • 转到屏幕顶部的“Xml”菜单选项
    • 选择“创建架构”

    这将生成您的 xsd 架构

    编辑 尝试this example 了解有关设置 minOccurs(在元素上)或 required(在属性上)的详细信息,以便您可以操作派生模式。

    【讨论】:

    • 我试过了,但是收到了一个带有“可选”属性的模式,这不是我需要的,因为我不知道我有多少属性
    • @Nikolai - 我已经扩展了我的答案。
    【解决方案2】:

    如果您不习惯自己编写 XSD,请使用类似 this 的生成器。

    编辑:根据您在 cmets 中的 XML,我可以想到 XSD 的以下结构

    <xsd:element name="FieldHeader">
         <xsd:complexType>
              <xsd:sequence>
                   <xsd:element name="Fields" type="xsd:string"/> <!--use minOccurs  maxOccurs here-->
              </xsd:sequence>
         </xsd:complexType>
     </xsd:element>
    <xsd:simpleType name="fieldi">  
        <xsd:restriction base="xsd:string"/>
    </xsd:simpleType>
    <xsd:simpleType name="Fields"> 
        <xsd:list itemType="fieldi" />
    </xsd:simpleType>
    

    【讨论】:

    • 我曾尝试使用一些生成器,但它们生成的属性带有“可选”标志。就我而言,我不知道标签 中有多少属性 fieldi
    • 如果你不知道一个元素会在 XML 中出现多少次,你可以将“fieldi”元素的 maxOccurs 属性设置为“unbounded”,这意味着可以出现尽可能多的作者希望的“fieldi”元素。
    • 不可能为属性设置 maxOccurs,只有元素可以这样做
    • 好的,让我们弄清楚这一点。在您的问题中添加一些示例 xml,我们将为它找出一个 XSD。
    • 示例: ROW>
    【解决方案3】:

    我想我已经理解了您的要求。为了避免误解,让我透露一下我曾经理解的内容:
    “你有一个 xml 文件,其中包含一个名为 fieldi 的元素,带有一组未知属性。这意味着你不知道[或说不想要]这些属性的名称和值。只是想要看,至少有 1 个属性出现",

    嗯。很抱歉,这个要求已经没有 XML 模式的能力了。 :-[

    您不能有未在架构中声明的属性。如果它出现在 xml 中,则需要对其进行适当的定义。有一个叫做 &lt;anyAttribute/&gt; [click-here] 的东西再次需要定义 [在某个地方,在另一个链接模式中]。

    1) 定义所有可能的属性,使use="optional",看起来实际上是不可能的。而且你的最后一个要求也被跳过了。
    2)如果可能的话,将所有属性转换为元素[使用转换,或者你可以要求发件人这样做,我不知道你的情况有多复杂],并定义元素&lt;any/&gt;,这听起来有点舒服。但是您的要求[至少必须出现一个属性]仍未达到。

    所以这是我可以为你添加的。如果您可以更改要求或输入 xml 结构,请告诉我,我会看看是否可以通过其他方式帮助您..

    问候,
    婴儿专业

    【讨论】:

    • 您好,现在可以将属性更改为元素,因为这不是我的 xml,我是从服务器接收的...无论如何,谢谢
    【解决方案4】:

    我通过以我需要的方式控制 xml 文档的反序列化以其他方式解决了这个问题。但是,我不喜欢这个解决方案,因为我想从 xsd 方案创建类并在我的代码中使用它们。

    谢谢大家

    【讨论】:

      猜你喜欢
      • 2011-06-03
      • 1970-01-01
      • 2019-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多