简体   繁体   中英

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

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:

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

My XML-schema definition so far looks like this:

<complexType name="SerializedDataType">
    <simpleContent>
        <extension base="double">

        </extension>
    </simpleContent>
</complexType>

I have also tried defining it like Ian Roberts suggested:

<element name="SerializedData"/>

However, when I use BPEL designer to initialize it like this:

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

I get the following warning:

The fixed value you entered does not appear to be valid XML (which is required for some types of fixed values to work correctly). It will be saved in a text format.

If I initialize it like this there is no warning:

<SerializedData>300.0</SerializedData>

But the problem is that the Web Service I am trying to invoke expects the request SOAP message to include the attribute xsi:type="xs:double". How can I make my SOAP request message to include it?

Any help would be greatly appreciated!

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>

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>

这个线程中的答案对我来说并不是很容易理解,我发现另一个线程对解决方案有更明确的解释: C# 序列化 xsi:type 和 xsd

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM