PR

ExcelでXMLファイルを読み込む際のXSDファイルの働き-その3

XMLの話題
この記事は約29分で読めます。

「Excel Tips」ではExcelを使用していて気付いたことを取り上げて行きます。

ExcelでXMLファイル読み込む(XMLデータのインポート)際のXMLスキーマファイル(.xsd)についての話題の第3回目で最終回になります。

第1回では複数のスキーマファイル(*.xsd)が設定されているXMLファイルでのXSDファイルの働きを確認し、第2回ではExcelではサポートされないスキーマ構造についてサンプルファイを使いながらご説明しました。

第3回目は実践編として国税庁が報告事項で使用しているXMLファイルを中心に現在公官庁で使われているXMLファイルを実際に使ってご説明いたします。

Excel 2016バージョン2107(ビルド 14228.20250)を使用しています。

スポンサーリンク

国税庁の報告事項で使用されているXMLファイル

国税庁では、例えば確定申告を電子申告・納税システム(e-Tax)でする場合、データの送受信にXMLファイルが使用されています。

ただこのXMLファイルはデータ受け渡しのためのもので、電子証明書を使って暗号化(バイナリー形式)されるので基本的には内容を見る事ができません。

という事で今回ご説明するのは、「報告金融機関等から所轄税務署長に対する報告事項」で使用されるXMLファイルになります。

ただこのXMLファイルの仕様は国税庁が独自に作成したものではなく、OECD(経済協力開発機構)が使用している共通報告基準(CRS:Common Reporting Standard)を適用しています。

なおCommon Reporting StandardステータスメッセージXMLスキーマは2019年6月にバージョン2.0に更新されていて2021年2月から運用が開始されているので最新版を使用します。

CRSのXMLスキーマバージョン2.0(ZIP)をダウンロードする

前章でご紹介したサイトからCRSのXMLスキーマバージョン2.0(ZIP)をダウンロードします。

ダウンロードしたCRS-Schema-v2.0.zipを解凍すると、下記5つのスキーマファイル(.xsd)になります。

Noファイル名接頭辞機能説明
1CrsXML_v2.0.xsdcrc他4つのスキーマファイルをimportする親ファイル
・CRSステータスメッセージの主要な要素を定義
2FatcaTypes_v1.2.xsdftc・No3~5の3つのスキーマファイルをimportする
・PoolReport要素を定義
3CommonTypesFatcaCrs_v2.0.xsdcfc・Address要素を定義
・小数点第2位の数値型を定義
・OECD601~OECD605を定義
・その他の子要素を定義
4oecdcrstypes_v5.0.xsdstf・DOcSpec要素を定義
・共通で使われる文字列長の型を定義
・OECD201~OECD208を定義
・OECD301~OECD305を定義
5isocrstypes_v1.1.xsdiso・国コードを定義
・通貨コードを定義

CRSのXMLスキーマバージョン2.0(以降「CRS_OECDスキーマ」と表記)の途中を省略した上での主要な階層構造は下記のようになります。なお表記上の注意点を先に列挙いたします。

  • 下記左側の参照①の部分には右側の参照①の4つの要素が入ります。参照②・参照③も同様
  • …は子要素がありますが省略していることを表します。
  • 緑色の文字の箇所は「CRS_OECDスキーマ」では「不使用」と説明されています。
CRS_OECD
  version
  MessageSpec…
  CrsBody
    ReportingFI
      参照①
      DocSpec…
    ReportingGroup
      Sponsor
        参照①
        DocSpec…
      Intermediary
        参照①
        DocSpec…
      AcountReport
        DOcSpec…
        AccountNumber…
        AccountHolder
          参照③
          AcctHolderType
        ControllingPerson
          参照③
          CtrlgPersonType
        AccountBalance…
        Payment…
      PoolReport…

参照①
   ResCountryCode
   IN…
   Name…
   Address…

参照②
   ResCountryCode
   TIN…
   Name… (①とは別)
   Address…
   Nationality
   BirthInfo…

参照③
   Individual
     参照②
   Organisation
     参照①

実は「CRS_OECDスキーマ」のすべての構造としては130近い要素・属性・型が使用されています。

とても説明しきれるボリュームではありませんが、ExcelワークシートのセルにXMLファイルのデータを読み込むにあたりヘッダー項目として表示されるので、ざっくりとではありますが一通りの内容を国税庁の「(共通報告基準ユーザーガイド第 3.0 版)仮訳」やスキーマ―ファイルに書かれているdocumentation要素の内容を元に、Excelシートに一覧表にまとめました。

なおExcelシートはMicrosoftサポートの「OneDrive から Web ページやブログに Excel ブックを埋め込む」に基づきExcelブックをOneDrive「https://onedrive.live.com」にアクセスをして下記に表示しています。
※iframeを使用しています。

【表記上の注意点】

  • 太字項目は自身に要素や属性を持たない親要素になり、Excelに読み込んだ時には取り込まれません。
  • ヘッダー「前出行」にはその項目が最初に出現した行番号がセットされています。
  • 青色以外の文字色の付いた項目グループは、同じ項目グループが別のところでも使われている事を表しています。
  • 項目名の最後に数字が附番されている項目は、同じ項目が別のところでも使われている事を表しています。(詳細は後段でご説明いたします)
  • 背景色薄灰色の行は「CRS_OECDスキーマ」では不使用の項目になります。
  • 青字の項目は親要素自身に<value>を持つ事を表します。(詳細は後段でご説明いたします)
  • 項目名の最後に「(=…)」が付いているのは、もともとの項目名ではなく注釈になります。

「CRS_OECDスキーマ」のサンプルXMLファイル

サンプルXMLファイルは国税庁の先の章でご紹介したページの「サンプルXMLファイル(XML/11KB)」から入手する事ができます。

ただしそのままリンクをクリックするとXMLファイルがブラウザー上で開いてしまうため、例えばGoogle Chromeであれば左図のようにマウスの右ボタンからショートカットメニューを表示して「名前を付けてリンク先を保存…」をクリックし、前章でCRS-Schema-v2.0.zipを解凍し保存したのと同じフォルダーに「xml_sample_r02.xml」ファイルを格納してください。

XMLファイルからスキーマファイル(.xsd)を「参照させる」

設定方法は第1回でご説明いたしまたが、前章で格納した「xml_sample_r02.xml」ファイルには名前空間を一括して宣言している「ルート要素のタグ」の中にスキーマファイル(.xsd)の配置場所を指定する「schemaLocation属性」が定義されていません。

<crs:CRS_OECD version="2.0"
xmlns:stf="urn:oecd:ties:crsstf:v5"
xmlns:crs="urn:oecd:ties:crs:v2"
xmlns:iso="urn:oecd:ties:isocrstypes:v1"
xmlns:cfc="urn:oecd:ties:commontypesfatcacrs:v2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:oecd:ties:crs:v2 CrsXML_v2.0.xsd">

ただその定義はとても簡単です。

というのはスキーマファイルCrsXML_v2.0.xsdは他4つのスキーマファイルをimportする親ファイルになっているので、「schemaLocation属性」にCrsXML_v2.0.xsdを指定するだけで済みます。

XMLファイルの「<crs:CRS_OECD …>」タグ全体を左記全7行で置き換えてください。

Excel「XML ソース」作業ウィンドウの「XMLの対応付け…」で開く

①xml_sample_r02.xmlを「XML ソース」作業ウィンドウの「XMLの対応付け…」から「追加」設定します。

第2回でご説明いたしましたが、もしもExcelではサポートされないスキーマ構造がXMLファイルに含まれている場合は、この時点で「以下のスキーマ要素と構造はワークシートに対応付ける事ができないため、[XMLソース]作業ウインドウには表示されません」のメッセージが表示されるのですが、xml_sample_r02.xmlは表示されません。

表示されないという事は「CRS_OECDスキーマ」にはサポートされないスキーマ構造は存在していない事になります。

「XMLの対応付け」には登録内容が反映されますので、「OK」ボタンをクリックします。

②XMLソースの「階層リスト」に要素・属性の一覧が表示されます。

※階層リストに表示される項目数は250になります。

③よく見るとそのなかに赤枠で囲んだ「<value>」という要素・属性とは異なる項目がある事が解ります。

最初の赤枠「ns1:IN」の当該部分をスキーマファイルで見てみると、下記のようになっています。

※annotationタグとdocumentationタグは省いています。

<xsd:complexType name="OrganisationParty_Type">
  <xsd:sequence>
    <xsd:element name="ResCountryCode" type="iso:CountryCode_Type" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="IN" type="crs:OrganisationIN_Type" minOccurs="0" maxOccurs="unbounded"/>
    <xsd:element name="Name" type="cfc:NameOrganisation_Type" maxOccurs="unbounded"/>

「IN」のtype「OrganisationIN_Type」は下記になります。

<xsd:complexType name="OrganisationIN_Type">
  <xsd:simpleContent>
    <xsd:extension base="stf:StringMin1Max200_Type">
      <xsd:attribute name="issuedBy" type="iso:CountryCode_Type" use="optional"/>
      <xsd:attribute name="INType" type="stf:StringMin1Max200_Type" use="optional/">
    </xsd:extension>
  </xsd:simpleContent>
</xsd:complexType>

この「OrganisationIN_Type」は単純型(simpleContent)を拡張(extension)していて、「IN」要素自身はbase属性で指定されているタイプのデータを持ちながら、attribute属性の「issueBy」と「INType」の属性を持つ複合型(complexType)になります。

そのような形の場合、Excelの階層リストで「IN」要素を選択すると、付随する「IN自身の持つデータ」と「issueBy」・「INTtpe」の3項目がワークシートのセルに対応付けられます。

そこで「IN自身の持つデータ」だけを選択できるようにするために「<value>」という項目が存在していると推察いたします。

なおデータ型の詳しい説明につきましては下記XMLマスターのサイトをご参照ください。

ワークシートのセルにXMLファイルのデータを読み込む

すべてのXML要素をワークシートのセルに対応付けとA行からGH行の範囲となり、「開発」タブの「XML」グループにある「データの更新」によりXMLファイルのデータをワークシートに取り込んむと下図のようになります。

②を見ていただくと分かるのですが、ヘッダー行の項目名の最後に連番が附番されている箇所が存在します。

この理由は「CRS_OECDスキーマ」には同じ項目名が使われている要素・属性が多くの箇所に存在しているためです。

といいますのはXML要素をワークシートのセルに対応付けると、その範囲がExcelのテーブルとして定義されます。

実はExcelのテーブルでは「ヘッダー項目がユニークな名前になっている」事が必要です。

そのためにExcelが勝手に項目名の後ろに連番を附番してユニークな名前になるようにしているからです。

ただし連番の付け方で少し残念なのは、項目名ごとに1から連番を附番するのではなく、ヘッダー行の最初から探して行って、別の箇所で使用されている項目名が現れるとカウントアップして番号を附番する点です。

なお「CRS_OECDスキーマ」の場合、最後の項目に連番が附番されていて「126」番になっています。

厚生労働省の特定健診・特定保健指導で使用されているXMLファイル

前章までは国税庁で使われているXMLファイルについて見てきましたが、ここからは厚生労働省で使われているXMLファイルをご説明して行きます。

なお国税庁のXMLファイルにつきましてはExcelで問題なく扱う事ができたのですが、厚生労働省のXMLファイルに関してはExcelで開く事さえできないスキーマファイル(.xsd)が存在します。

「なぜ開く事ができないのか?」も含めて順を追ってご説明して参ります。

特定健診・特定保健指導で使用されているXMLファイルの種類と入手方法

厚生労働省では平成20年(2008年)から「特定健康診査・特定保健指導の電子的な標準様式の仕様」としてXMLファイルが使用されていて、第一期が2008年度から2012年度第二期が2013年度から2017年度、そして現在は第三期で2018年度から2023年度に当たり、長い期間運用されてきています。(第三期は下記リンクをご参照ください)

XMLファイルは用途により多岐に分かれていますが、スキーマファイル(.xsd)は13種類にまとめられています。

なおスキーマファイル(.xsd)の更新日付を確認すると2008年のままのものもありますが、一部は期に応じて更新されているようです。

スキーマファイル(.xsd)の種類

ここで特定健診・特定保健指導で使用されている一通りの「スキーマファイル(.xsd)の種類」をまとめます。

※「co08_V08」「core」は共通で使われるスキーマで、〇を付けたスキーマから呼ばれます。
※「core」は4つのスキーマファイ(.xsd)の総称になります。
※サンプルデータの項目の説明は後述いたします。

Noスキーマ名説明co08_V08core
総称
サンプル
データ
1cc08_V08.xsd特定健診決済情報ファイル用3(1)(2)
2gc08_V08.xsd特定保健指導決済情報ファイル用4(1)~(9)
3ix08_V08.xsd特定健診・特定保健指導交換用基本情報ファイル用1
4aix08_V08.xsd特定健診・特定保健指導交換用基本情報ファイル用
5su08_V08.xsd特定健診・特定保健指導決済情報集計ファイル用2
6asu08_V08.xsd特定健診・特定保健指導集計情報ファイル用
7hc08_V08.xsd特定健診情報ファイル用3(1)(2)
8hg08_V08.xsd特定保健指導情報ファイル用4(1)~(9)

下記スキーマは共通で呼ばれるスキーマなります。

※この内「core」の表記でまとめている4つのスキーマは「米国HL7(=Health Level Seven International) で公開されているHL7 CDA(=Clinical Document Architecture) 標準規格用の共通XMLスキーマを一部修正して転載している」という説明が、先ほどご紹介したサイトの資料No7(1)に書かれています。

Noスキーマ名説明
9co08_V08.xsd特定健診・特定保健指導決済および集計情報共通スキーマ
Nocore(総称)HL7CDA標準規格用の共通XMLスキーマを部修正したもの
10datatypes-base_hcgv08.xsdHL7 データ型基本スキーマ
11datatypes_hcgv08.xsdHL7 データ型拡張スキーマ
12voc_hcgv08.xsdHL7 ボキャブラリドメインスキーマ
13narrativeBlock_hcgv08.xsd –CDA 説明ブロックスキーマ

すべてのスキーマファイル(.xsd)をダウンロードする

先ほどご紹介したサイトの資料No11「すべてのXMLスキーマファイルのアーカイブファイル」の右側の「(ZIP)[6KB]」をクリックするとZIPファイルがダウンロードされます。

※リンク先アドレス:https://www.mhlw.go.jp/content/12400000/ZIP.zip

ZIPファイルを解凍すると下図のように4つのフォルダーがありますが、今回は赤枠で囲った「XML(健診・保健指導機関等→医療保険者)」のフォルダーにあるスキーマファイルを使ってご説明いたします。

※他のフォルダーのスキーマファイルも名前が同じものは同じ内容です。
※前章で「core(総称)」とご説明した4つのスキーマは「coreschemas」というファイルフォルダーに格納されています。hc08_V08.xsd・hg08_V08.xsdから「core(総称)」を呼ぶ時のフォルダー名として「coreschemas」が使用されていますので、そのままの形にして残します。

XMLファイルのサンプルデータをダウンロードする

スキーマファイル(.xsd)は入手できましたので、つぎにXMLファイルをダウンロードします。

先ほどご紹介したサイトの資料No1(1)・No2(1)・No4(1)・No6(1)のPDF資料の中にサンプルXMLファイルが収納されていますが、「core(総称)」を使っているhc08_V08.xsd・hg08_V08.xsdのXMLファイルが載っていません。

そこでGoogleで検索したところ、下記「社会保険診療報酬支払基金」のサイトにサンプルデータが掲載されていましたので、このサンプルデータを使う事にいたします。

※先の章でご説明したブラウザーから「名前を付けてリンク先を保存…」の操作で、「XML(健診・保健指導機関等→医療保険者)」のフォルダーの中にXMLファイルを保存します。
※「スキーマファイル(.xsd)の種類」の章の表の中に記載した「サンプルデータ」の項目は、上記サイトの項目番号を表しています。

今回は「1.交換用基本情報ファイルのXMLサンプルデータ及び解説」の「特定健診の交換用基本情報ファイルのXMLサンプルデータ(FILES:731bytes)」と「3.特定健診データのXMLサンプルデータ及び解説(1)特定健診(基本+詳細+任意追加項目)」の「特定健診データのXMLサンプルデータ(FILES:33KB)」を使って順番にご説明いたします。

  • リンク先アドレス
    • https://www.ssk.or.jp/jigyonaiyo/tokuteikenshin/tokuteijoho/tokuteijoho_01_h30.files/koukan_tokutei.xml
    • https://www.ssk.or.jp/jigyonaiyo/tokuteikenshin/tokuteijoho/tokuteijoho_01_h30.files/kensin_kihon_tokutei.xml

koukan_tokutei.xml(1.交換用基本情報ファイル…)を読み込む

koukan_tokutei.xmlファイルの「ルート要素のタグ」「index」にはスキーマファイル(.xsd)の配置場所を指定する「schemaLocation属性」が定義されています。

ただし、スキーマファイル(.xsd)が「XSD」フォルダーに格納されている形で定義されていますので、「./XSD/」を削除する必要があります。

削除前:xsi:schemaLocation="http://tokuteikenshin.jp/checkup/2007 ./XSD/ix08_V08.xsd"
      ↓
削除後:xsi:schemaLocation="http://tokuteikenshin.jp/checkup/2007 ix08_V08.xsd"

Excel「XML ソース」作業ウィンドウの「XMLの対応付け…」で開く

①koukan_tokutei.xmlを「XML ソース」作業ウィンドウの「XMLの対応付け…」から「追加」設定します。

②すると「XML内のエラー」が表示されてしまいます。

そこで詳細ボタンをクリックしてエラーの理由を確認します。

③初見では何を意味しているのか?解り難いのですが、XPath (XML Path Language)構文を使って記述されていて、『schemaの中の、4番目に現れるcomplexType(nameは「Index.ReceiverId」)の1番目の子要素attribute(nameは「root」)の型(type)「receiverOid」が宣言されていない』と言う意味になります。

ix08_V08.xsdの中には「receiverOid」を定義しているところは無いので、共通スキーマであるco08_V08.xsdの中を検索すると確かに定義している箇所が存在します。

ではなぜ「XML内のエラー」が表示されのでしょうか?

スキーマファイル(.xsd)にinclude要素を含む際の注意点

最初は「何がいけないのか?」まったく解らなかったので、エラーになる定義を共通スキーマco08_V08.xsdからix08_V08.xsdにコピーして再度「XMLの対応付け…」をやり直す作業を繰り返し実施したところ、エラーにならず「XMLの対応付け」に登録内容が反映されました。

本来ix08_V08.xsdに記述されているinclude要素が正しく読み込まれているのであれば、co08_V08.xsdからコピーした定義は「重複した名前」でエラーになるはずなのですが…

このことから導き出された結論は下記になります。

  • 「XMLの対応付け…」でスキーマファイル(.xsd)を「参照している」XMLファイルを選択した場合は、スキーマファイル(.xsd)に記述されたinclude要素は解釈されません。
    • include要素は同じ名前空間に属するXML Schemaを読み込む時に使用します。
  • 逆の言い方をしますと、スキーマファイル(.xsd)にinclude要素が含まれている場合は「XMLの対応付け…」でスキーマファイル(.xsd)を選択する必要があります。

第1回目でご紹介したcd.xsdでは別名前空間のartist.xsdをimport要素で読み込んでいましたので、import要素に関しては問題なく解釈される事になります。

なお第1回目の記事を書いた時点では、この事象を把握しておらず申し訳ありません。

「XMLの対応付け…」でXMLスキーマファイル(*.xsd)を選択する場合の操作方法

第1回目の時に、対応付けに際して「XMLスキーマファイル(*.xsd)」を選んだ場合の手順の前半部分を簡単にご紹介しましたが、ここで改めてご説明いたします。

なおMicrosoft Officeサポートの「EXCEL の XML の概要」のページの「Excel で XML データを使う基本的なプロセス」の操作方法は、今回ご説明する手順で書かれています。

①対象のXMLファイルkoukan_tokutei.xmlのスキーマファイルix08_V08.xsdを選択します。

②複数ルートのウインドウが開きます。

「ルートを選択してください」のリストボックスには20項目が表示されていますが、調べてみると、ix08_V08.xsdに定義されているグローバル宣言の要素が5個で、co08_V08.xsdに15個あります。

このことからix08_V08.xsdに記述されているinclude要素が正しく読み込まれている事が解ります。

ここではkoukan_tokutei.xmlのルート要素であるindexを選択しOKボタンをクリックします。

③「XMLの対応付け」ウインドウに選択したスキーマが登録されますのでOKボタンをクリックします。

④「XMLソース」ウインドウにスキーマが「階層リストで表示」されるので、XML要素をワークシートのセルに対応付けします。

今回はルート要素を選びマウスの右ボタンでショートカットメニューを表示させて「要素の対応付け(M)…」を選びます。

⑤要素の対応付けウインドウが開くので、デフォルトでセットれる場所の範囲を確認してOKボタンをクリックします。

⑥ワークシートに罫線が表示されるので、リボンの「開発」メニュー→XMLグループにある「インポート」をクリックします。

「XMLの対応付け…」でXMLファイルを選択した場合と異なり、XMLグループにある「データの更新」は有効化されていません。

⑦「XMLのインポート」ウインドウが開くので、koukan_tokutei.xmlをクリックします。

⑧ワークシートの罫線部分にXMLデータが読み込まれます。

以上で操作は完了になります。

なおこの方法の場合は、インポートする時にkoukan_tokutei.xmlファイルの「schemaLocation属性」は使われないように思うのですが、どうやら存在確認をするようで、ディレクトリーが合っていないとエラーになります。

そのため指定されているディレクトリーを事前に修正する必要がありますのでご注意ください。

kensin_kihon_tokutei.xml(3.特定健診データの…)を読み込む

前章でスキーマファイル(.xsd)にinclude要素が含まれている場合は「XMLの対応付け…」でスキーマファイル(.xsd)を選択する必要がある事をご説明しましたが、今回のkensin_kihon_tokutei.xmlが使用するhc08_V08.xsdスキーマファイルもcore(総称)をincludeしているために、「XMLの対応付け…」でXMLスキーマファイル(*.xsd)を選択する必要があります。

「XMLの対応付け…」でXMLスキーマファイル(*.xsd)を選択する

①「XMLの対応付け…」で対象のスキーマファイルhc08_V08.xsdを選択します。

②処理は始まり、カーソルは処理中を表すグルグルマーク(Aero cursor)になるのですが、しばらく経った後、何も結果を返さず、エラーも表示されずに元に戻ります。

③windowsの「スタート」→「WIndows管理ツール」→「リソースモニター」でリソースモニターを起動してExcelを選択し、同じ処理を実行して元に戻った直後の状態で画面キャプチャーしたものです。

CPUの状態は「応答なし」で34%使用、ディスクはそれほど変化はありませんが、メモリは43%使用している事が解ります。

windowsのイベントビューアに直接原因となるようなログが出力されていない事は確認しました。その上でこの動き方を見る限り、「Excel自身が何かの異常を検知して途中で処理を強制終了させた」ように思われます。

最初は「何がどうなっているのか?」まったく解らなかったのですが、前章でやったようにhc08_V08.xsdで使用されている定義を「core(総称)」の4つのスキーマファイルからにコピーしていく事にしました。

この理由としては使われているスキーマファイル群には2,450近くの要素・属性・型が含まれていて、今までご紹介してきたものの中でも群を抜いて数が多かったためです。

なおhc08_V08.xsdでは「datatypes_hcgv08.xsd」「voc_hcgv08.xsd」「narrativeBlock_hcgv08.xsd」の3つのスキーマファイルがincludeされているので、その部分は注釈にしています。

ちなみに「datatypes-base_hcgv08.xsd」は「datatypes_hcgv08.xsd」のなかでincludeする構造になっています。

地道に「XMLの対応付け…」をやり直す作業を繰り返し実施したところ、もともと550行ぐらいだったhc08_V08.xsdファイルが4,800行ぐらいなったところで、先ほどと同じ現象が再現されました。

という事は「core(総称)」の4つのスキーマファイルのあり方の問題ではなく、hc08_V08.xsd自身のスキーマ構造に起因して起こると推察致します。

「XMLの対応付け…」でhc08_V08.xsdが処理できない要因は?

実は定義をコピーしていて少し気になってはいたのですが、「core(総称)」で定義されている型(type)の中にExcelではサポートされないスキーマ構造がちょくちょく存在していました。

その中で特に問題になりそうなのは、第2回の具体的なサンプルをお示しできていない「再帰構造—Recursive structures」が使われているところです。

下記に一例として「CD」という型(type)をご紹介いたしますが、他にもいくつか存在しています。

ちなみにhc08_V08.xsdでは「CD」という型(type)が3か所で定義されています。

※簡略化のためにannotaion要素に含まれる記述は除いています。

<xs:complexType name="CD">
  <xs:complexContent>
    <xs:extension base="ANY">
      <xs:sequence>
        <xs:element name="originalText" type="ED" minOccurs="0"/>
        <xs:element name="qualifier" type="CR" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element name="translation" type="CD" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute name="code" type="cs" use="optional"/>
      <xs:attribute name="codeSystem" type="uid" use="optional"/>
      <xs:attribute name="codeSystemName" type="st" use="optional"/>
      <xs:attribute name="codeSystemVersion" type="st" use="optional"/>
      <xs:attribute name="displayName" type="st" use="optional"/>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>

この「CD」の定義のなかで、7行目の「translation」要素に自分自身を型(type)指定している箇所があります。

また6行目で「CR」という型(type)を指定していますが、その定義は下記になります。

<xs:complexType name="CR">
  <xs:complexContent>
    <xs:extension base="ANY">
      <xs:sequence>
        <xs:element name="name" type="CV" minOccurs="0"/>
        <xs:element name="value" type="CD" minOccurs="0"/>
      </xs:sequence>
      <xs:attribute name="inverted" type="bn" use="optional" default="false"/>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>

6行目で「CD」型を指定していますが、「CD」の定義で「CR」型を使用し、方や「CR」の定義で「CD」型を使用するという「相互での再帰構造」が散見されます。

再帰構造が存在するとExcelでは処理がループするのか?

第2回の時にサンプルをお示しできていなかったので、前章のケースをもとに再帰構造を使ったスキーマファイルを作ってみました。

ただしXML文章としての内容が伴っていませんのでお含み置きください。

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns="cd-ns"
   targetNamespace="cd-ns"
   elementFormDefault="qualified"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--discs-->
  <xsd:element name="discs" type="discsType"/>
  <xsd:complexType name="discsType">
    <xsd:sequence maxOccurs="unbounded">
      <xsd:element name="disc" type="discType"/>
    </xsd:sequence>
  </xsd:complexType>
<!--discType-->
  <xsd:complexType name="discType">
    <xsd:sequence>
      <xsd:element name="cd" type="discType"/>
      <xsd:element name="series" type="discsType"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

紛らわしくて恐縮ですが「discsType」(複数形)と「discType」(単数形)を使用しています。

  • discsTypeの定義の中でdiscType型(type)を指定しています。
  • discTypeの定義の中でdiscsType型(type)を指定しています。
  • discTypeの定義の中でdiscType型(type)を指定しています。

※スキーマファイルの名前はcdr,xsdとします。

※なおこのスキーマファイルの要素は「discs」のみです。

①「XMLの対応付け…」でcdr.xsdを選択します。

②要素がひとつなので「複数ルートのウインドウ」は開かずに、「以下の要素と構造が含まれているため、XMLスキーマをブックに追加できませんでした」という警告メッセージが表示されます。

OKボタンをクリックします。

③「XMLの対応付け」ウインドウには何も登録されていません。

再帰構造といってもcdr.xsdのように簡単なものであれば、Excelが構造を解析してメッセージを表示してくれる事が解りました。

従ってhc08_V08.xsdでは「警告メッセージを出力するための前処理のどこかに想定を超えるデータ量もしくは構造があるのではないか?」と推察いたします。

そうなると、「どのくらい複雑だと処理がループするのか?」が気になる所ですが、さすがにこれは「やってみないと分からない」というのが正直なところです。

まとめ

ExcelでXMLファイル読み込む(XMLデータのインポート)際のXMLスキーマファイル(.xsd)について、3回に渡り実際に動かせるサンプルファイルを使いながらご説明して参りました。

最後に処理できない例をお示しする事になってしまったのは残念ではありますが、第1回・第2回でスルーしてきた部分を見直すことができたので良かったと思っています。

これまでインポートについては一通り見て参りましたので、この後エクスポートについてご説明いたく存じます。

ただ「ほぼほぼExcelではエクスポートはできない」と言われていますが、「実際にできる範囲はどこなのか?」をお伝えできれば良いと考えています。

以上最後までご一読いただき誠にありがとうございました。