代码之家  ›  专栏  ›  技术社区  ›  meandmycode

作为特定复杂类型扩展的任何类型元素的XSD序列

xsd
  •  4
  • meandmycode  · 技术社区  · 16 年前

    基本上,如果这是.NET,它会如下所示:

    ISomething
    {
      string A { get; }
      int B { get; }
    }
    
    var somethings = new List<ISomething>();
    something.Add(new SomethingSomething());
    something.Add(new AnotherSomething());
    something.Add(new AnythingSomething());
    

    基本上,我希望元素序列被命名为他们想要的任何东西,只要他们的复杂类型是我定义的复杂类型的扩展。

    所以它可能看起来像:

    <somethings>
      <something-something a="foo" b="0" />
      <another-something a="bar" b="1" />
      <example:anything-something a="baz" b="2" />
    </somethings>
    

    我确信这是可能的,我猜另一种选择是构图,在构图中我有一个标准元素,它可以包含一个至少是“某物”的子元素。

    事先谢谢,XSD不是我的强项。


    编辑,好吧,到目前为止我发现的最接近的东西基本上是:

    <somethings>
      <something xsi:type="something-something" a="foo" b="0" />
      <something xsi:type="another-something" a="bar" b="1" />
      <something xsi:type="example:anything-something" a="baz" b="2" />
    </somethings>
    

    我想这是唯一的处理方法?如果是这样的话,这还不错,而且vs intellisense似乎已经足够理解这一点了。

    谢谢。

    1 回复  |  直到 13 年前
        1
  •  1
  •   g t Omri Btian    13 年前

    这是个好问题。您可以做一个“any”序列,这将允许您在其中任意命名元素,但这不会以任何方式约束它们。或者,下面的模式约束名称和属性,但没有其他约束(如第二个示例中所示)。

    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
      <xs:complexType name="somethingsType" >
        <xs:complexContent>    
          <xs:restriction base="xs:anyType">
           <xs:attribute name="a" type="xs:string"/>
           <xs:attribute name="b" type="xs:string"/>
          </xs:restriction>
        </xs:complexContent>
      </xs:complexType>
    
      <xs:complexType name="somethingsSeq" >
        <xs:sequence>
          <xs:element name="something" type="somethingsType"/>
        </xs:sequence>
      </xs:complexType>
    
      <xs:element name="somethings"  type="somethingsSeq"/> 
    
    </xs:schema>
    

    我找不到约束类型而不是元素名的方法。