2010-01-05 52 views
4

基本上,如果这是.NET,它应该是这样的:XSD序列,具体的复杂类型的扩展

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> 

我想这是这个被处理的唯一途径?如果是这样,这不是很糟糕,而vs intellisense似乎已经很好地理解了这一点。

谢谢。

回答

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> 

我无法找到一个方法来限制的类型,但不是元素名称。

+0

感谢您确认这一点,我猜元素和类型在XML中更加明显,所以我们都来到的版本可能是做这种事情的预期方式..再次感谢 – meandmycode