How to define xsi:type as an attribute in XML-schema?

后端 未结 2 1055
滥情空心
滥情空心 2021-01-17 18:00

I have an XML for which I want to write a schema definition. The problem is that I don\'t know how to define xsi:type as an attribute. Here is the XML element:



        
相关标签:
2条回答
  • 2021-01-17 18:27

    You don't need to - just declare the element without a type at all.

    <element name="SerializedData" />
    

    The xsi:type attribute is used to indicate to the schema validator that the real type of a particular instance of an element is not the element's declared type but rather a sub-type derived from the declared type. By declaring the element with no type you are saying it can have any type, and you will use xsi:type in the instance to specify which.

    Strictly you're declaring an element whose type is the "ur-type" which is the root of the XML Schema type hierarchy - all types, simple and complex, ultimately derive from the ur-type. If you want to restrict the SerializedData element to simple content only (no sub-elements or attributes) then declare it as

    <element name="SerializedData" type="anySimpleType" />
    

    Regarding the second part of your question, your designer tool is right that in isolation

    <SerializedData xsi:type="xs:double">300.0</SerializedData>
    

    is not correct XML, because the xsi namespace has not been declared. Try adding the namespace declarations:

    <SerializedData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xsi:type="xs:double">300.0</SerializedData>
    
    0 讨论(0)
  • 2021-01-17 18:36

    The xsi:type attribute doesn't need to be declared in the schema: it's implicitly declared, and can be used on any element. But in an instance, it has to be a valid QName.

    If you write

    <SerializedData xsi:type="xs:double">300.0</SerializedData>
    

    then

    (a) to be namespace-well-formed, you need to declare the "xsi" namespace

    (b) to be schema-valid, you also need to declare the "xs" namespace.

    As Roberts indicated, this means you should write

    <SerializedData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xsi:type="xs:double">300.0</SerializedData>
    
    0 讨论(0)
提交回复
热议问题