任何类型元素的xsd序列,它是特定复杂类型的扩展

时间:2010-01-05 16:00:02

标签: xsd

基本上如果这是.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>

我确信这是可能的,我猜的另一种选择是组合,我有一个标准元素,可以包含一个至少是'Something'的孩子..

先谢谢,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>

我想这是处理它的唯一方法吗?如果是这样,这并不是那么糟糕,而且intellisense似乎也很清楚这一点。

感谢。

1 个答案:

答案 0 :(得分:1)

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

<?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>

我找不到限制类型但不限制元素名称的方法。