XSDファイルでxs:union型を定義したXMLファイルをExcel2010で「XMLテーブルとして開く」とインポートエラーメッセージが表示されます。
サンプルを末尾に記載しています。
XMLファイルのvalue1、value2には数値もしくは"ND"の文字列が入ります。
数値のときはdouble型として、"ND"のときは文字列としてインポートしたいので、
XSDファイルで以下のようにxs:stringとxs:doubleをメンバとして持つunion型を定義しました。
<xs:simpleType name="ST_value1">
<xs:union memberTypes="xs:string xs:double"/>
</xs:simpleType>
このXMLファイルをExcel2010で「XMLテーブルとして開く」と
「次のファイルをインポート中にエラーが発生しました:」
「一部のデータはテキストとしてインポートされました」
云々のエラーメッセージダイアログが表示されます。
意図どおりに数値と"ND"文字がインポートできる上で、
このエラーメッセージダイアログが表示されないようにする方法はないでしょうか?
ちなみにサンプルではインポート自体は意図通りにできているのですが
(数値は数値、"ND"は文字列としてインポートされている)、
これはXSDがちゃんと機能したからではなく、エラーメッセージに記載された
「一部のデータはテキストとしてインポートされました」
の結果のような気がします。
基本double型でインポートを行い、"ND"にぶつかったときはexcelが気を利かせて文字列としてインポートした、
みたいな感じではないかと考えています。
以下はサンプルです。
■sample.xmlファイル
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="sample.xsd">
<test>
<value1 unit="g">0</value1>
<value2 unit="g">1.2E01</value2>
</test>
<test>
<value1 unit="g">10</value1>
<value2 unit="g">0</value2>
</test>
<test>
<value1 unit="g">10.5</value1>
<value2 unit="g">5</value2>
</test>
<test>
<value1 unit="g">9.0E-02</value1>
<value2 unit="g">5.5</value2>
</test>
<test>
<value1 unit="g">ND</value1>
<value2 unit="g">ND</value2>
</test>
</root>
■sample.xsdファイル
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="ST_value1">
<xs:union memberTypes="xs:string xs:double"/>
</xs:simpleType>
<xs:simpleType name="ST_value2">
<xs:union memberTypes="xs:string xs:double"/>
</xs:simpleType>
<xs:element name="value2">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="ST_value2">
<xs:attribute name="unit" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="g"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="value1">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="ST_value1">
<xs:attribute name="unit" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="g"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="test">
<xs:complexType>
<xs:sequence>
<xs:element ref="value1"/>
<xs:element ref="value2"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element ref="test" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>