2015-07-30

XMLの読込 - 断片化と平坦化

XMLはプラットフォームに依存しない汎用的なデータ交換用フォーマットとしてさまざまな分野で利用されています。

FMEでは、Fragmentation (断片化) と Flattening (平坦化) という2つの手法によって任意のXML文書からデータを抽出、変換することができます。

FME 2015.1.1.0 build 15515

=====
基盤地図情報「基本項目」等高線, 標高点データを Shapefile 形式に変換する。

ソースデータ:
基盤地図情報ダウンロードサービスサイトからダウンロードした「基本項目」等高線, 標高点データ (GML形式)
ダウンロードファイル名:
等高線: FG-GML-aaaaaa-Cntr-bbbbbbbb-cccc.xml
標高点: FG-GML-aaaaaa-ElevPt-bbbbbbbb-cccc.xml
aaaaaa は2次メッシュコード, bbbbbbbb は年月日, cccc は枝番
=====

FMEワークスペース例























[XML] リーダー: 基盤地図情報「基本項目」等高線、標高点データを読み込む。
GeometryReplacer: ジオメトリを記述しているXML文書の断片 (GML形式) に基づきジオメトリを作成する。
[SHAPE] ライター: Shapefile 形式のファイルに出力する。

注: 基盤地図情報の応用スキーマは FME に組み込まれており、基本項目は [GML] リーダーで読み込むことができますが、このワークスペース例では、断片化、平坦化の仕組みを示すために汎用の [XML] リーダーを使いました。

結果: FME Data Inspector による表示


















次の簡単なXML文書を例として、Fragmentation (断片化) と Flattening (平坦化) について説明します。

<?xml version="1.0"?>
<dataset>
  <Feature id="1">
    <name>abc</name>
    <position>
      <x>139.878794000</x>
      <y>35.764632528</y>
    </position>
  </Feature>
  <Feature id="2">
    <name>xyz</name>
    <position>
      <x>139.875861750</x>
      <y>35.759115861</y>
    </position>
  </Feature>
</dataset>

Fragmentation (断片化): 特定の名前のXML要素を抽出し、それをルート要素とするXML文書を作成する。

上記例を Feature 要素について断片化すると、次の2つのXML文書が作成されます。断片化によって作成された個別のXML文書を fragment (断片) と呼びます。

<?xml version="1.0"?>
<Feature id="1">
  <name>abc</name>
  <position>
    <x>139.878794000</x>
    <y>35.764632528</y>
  </position>
</Feature>

<?xml version="1.0"?>
<Feature id="2">
  <name>xyz</name>
  <position>
    <x>139.875861750</x>
    <y>35.759115861</y>
  </position>
</Feature>

Flattening (平坦化): XML要素・属性の値を抽出し、元の要素・属性名で構成される名前の属性に格納する。

平坦化後の属性名は、XMLドキュメントツリーにおける上位から下位の順で、XML要素名・属性名をドット "." 区切りで連結した文字列となります。上記例を Feature 要素について断片化した後、さらに平坦化すると次のようなテーブルが得られます。








[XML] リーダーの基本的な機能は、パラメーターで指定された要素についてXML文書を断片化し、個々の断片をフィーチャーとして読み込むことです。さらにオプションとして、断片化した要素の平坦化や、断片内の下位のXML要素の断片化ができます。

ワークスペース例では、リーダーをワークスペースに追加する際、Add Reader 画面 Format フィールドで XML を選択した後、次のようにパラメーターを設定しました。

[XML] リーダーパラメーター設定画面























Configuration Type: Feature Paths (デフォルト)
[XML] リーダーの構成方法として他に xfMap, XRS ファイルによる方法もありますが、Feature Paths が推奨されています。

Elements to Match:
断片化するXML要素名を指定します。複数あるときはスペースまたは改行区切りで列挙します。
この例では、個々の等高線、標高点のデータが記述されているXML要素名 (等高線: Cntr, 標高点: ElevPt) を指定しました。

Flatten Options: Options ボタンクリック => XML Flatten Options 画面 (右上)
断片化したXML要素を平坦化する場合に Enable Flattening チェックボックスをチェックします。
=====
注: FME 2016 以降では、デフォルトで Enable Flattening チェックボックスがチェックされています。
=====

Descendant Options: Options ボタンクリック => XML Descendant Options 画面 (右下)
Elements to Match で指定したXML要素の下位のXML要素も断片化する場合に、そのXML要素名を指定します。複数あるときはスペースまたは改行区切りで列挙します。

この例では、GML形式でジオメトリが記述されているXML要素 (等高線: Curve, 標高点: Point) を断片化し、後述するように、それらに基づいて GeometryReplacer によってジオメトリを作成することとしました。

注: この例のように Elements to Match パラメーターで指定したXML要素 (Cntr, ElevPt) の下位にGML要素 (Curve, Point) がある場合は、上位の断片 (後述の "xml_fragment") に基づいて GeometryReplacer によってジオメトリを作成することもできますが、ここでは Descendant Options の働きを示すために Curve, Point 要素を断片化しました。

以上の設定をした後、Add Reader 画面 Dataset フィールドで基盤地図情報「基本項目」等高線、標高点データファイルを選択してリーダーを追加すると、キャンバスには Elements to Match で指定したXML要素名と同じ名前のフィーチャータイプが現れます。

XML リーダーフィーチャータイプ (左: 等高線, 右: 標高点)


















平坦化オプションを指定したので、これらのフィーチャータイプの属性リストには下位のXML要素・属性に対応する属性が追加されました (Cntr.id, alti, など)。

"xml_fragment" 属性には、断片化されたXML文書 (Cntr, ElevPt をルート要素とする) が格納されます。

Descendant Options によって抽出される下位のXML要素の断片は "xml_fragment_<XML要素名>{}" という名前のリスト属性に格納されます。この例では次のとおりです。

等高線: xml_fragment_Curve{}
標高点: xml_fragment_Point{}

スキーマによっては同じ名前の下位XML要素が複数あることもあるので、下位の断片はそれらを要素とするリスト属性として抽出されます。この例ではリストの要素数は常に1です (各フィーチャーはジオメトリ要素をひとつずつ持つ)。

次に基盤地図情報「基本項目」等高線、標高点XML文書を抜粋して掲載します。[XML] リーダーによる断片化、平坦化の結果 (キャンバス上のフィーチャータイプ及びその属性リスト) と見比べて下さい。

青色の部分は Descendant Options の設定によって断片化される下位要素 (GML形式でジオメトリが記述されている部分) です。
----------
(基盤地図情報 等高線XML)
<?xml version="1.0" encoding="utf-8"?>
<Dataset xsi:schemaLocation="http://fgd.gsi.go.jp/spec/2008/FGD_GMLSchema FGD_GMLSchema.xsd"
xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://fgd.gsi.go.jp/spec/2008/FGD_GMLSchema"
gml:id="Dataset1">
  <gml:description>基盤地図情報メタデータ ID=fmdid:14-1001</gml:description>
  <gml:name>基盤地図情報ダウンロードデータ(GML版)</gml:name>
  <Cntr gml:id="K3_5035512870_1">
    <fid>50355-12870-s-12800</fid>
    <lfSpanFr gml:id="K3_5035512870_1-1">
      <gml:timePosition>2014-09-01</gml:timePosition>
    </lfSpanFr>
    <devDate gml:id="K3_5035512870_1-2">
      <gml:timePosition>2014-10-16</gml:timePosition>
    </devDate>
    <orgGILvl>25000</orgGILvl>
    <loc>
      <gml:Curve gml:id="K3_5035512870_1-g" srsName="fguuid:jgd2011.bl">
        <gml:segments>
          <gml:LineStringSegment>
            <gml:posList>
35.752999472 139.875000000
35.752998472 139.875004472
(中略)
35.750000000 139.878976306
            </gml:posList>
          </gml:LineStringSegment>
        </gml:segments>
      </gml:Curve>
    </loc>
    <type>一般等高線</type>
    <alti>2.5</alti>
  </Cntr>
  (以下 Cntr 要素の繰り返し)
</Dataset>
----------
(基盤地図情報 標高点XML)
<?xml version="1.0" encoding="utf-8"?>
<Dataset xsi:schemaLocation="http://fgd.gsi.go.jp/spec/2008/FGD_GMLSchema FGD_GMLSchema.xsd"
xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://fgd.gsi.go.jp/spec/2008/FGD_GMLSchema"
gml:id="Dataset1">
  <gml:description>基盤地図情報メタデータ ID=fmdid:14-1001</gml:description>
  <gml:name>基盤地図情報ダウンロードデータ(GML版)</gml:name>
  <ElevPt gml:id="K2_5035512873_1">
    <fid>50355-12873-i-9</fid>
    <lfSpanFr gml:id="K2_5035512873_1-1">
      <gml:timePosition>2013-08-14</gml:timePosition>
    </lfSpanFr>
    <devDate gml:id="K2_5035512873_1-2">
      <gml:timePosition>2014-10-16</gml:timePosition>
    </devDate>
    <orgGILvl>25000</orgGILvl>
    <vis>表示</vis>
    <pos>
      <gml:Point gml:id="K2_5035512873_1-g" srsName="fguuid:jgd2011.bl">
        <gml:pos>35.764632528 139.878794000</gml:pos>
      </gml:Point>
    </pos>
    <type>標高点(測点)</type>
    <alti>3</alti>
  </ElevPt>
  (以下 ElevPt 要素の繰り返し)
</Dataset>
----------

Descendant Options によって断片化した下位XML要素 (等高線: Curve, 標高点: Point) はGML形式なので、それに基づいて GeometryReplacer によってジオメトリを作成することができます。

GeometryReplacer パラメーター設定画面 (左: 等高線, 右: 標高点)












Fragmentation (断片化)、Flattening (平坦化) は XMLFragmenter, XMLFlattener トランスフォーマーによってデータフローの途中で行うこともできます。

XMLは汎用フォーマットであり、用途に応じて具体的なデータ構造 (スキーマ) が異なりますが、どのようなスキーマであってもこれらの仕組みを使うことにより、データを抽出、変換するためのワークスペースを作成することができます。

補足:
[XML] リーダーで平坦化をすると、デフォルトではフィーチャータイプとしたXML要素の全ての下位XML要素・属性がフィーチャー属性として抽出されますが、必要がない属性も多数含まれることがあります。

データフローのどこでも AttributeRemover/AttributeKeeper によって不要な属性は削除できますが、[XML] リーダーの Flatten Options では、初めから属性として抽出しない (無視する) 下位XML要素を指定することもできます。

Flatten Options の設定は、リーダーをワークスペースに追加した後でも、Navigator ウィンドウからパラメーター設定画面を開いて行うことができます。


















XML Flatten Options 画面で Ignore Specific Sub-Elements (特定の下位要素を無視する) チェックボックスをチェックしたうえで、Sub-Elements To Ignore (無視する下位要素) フィールドに、フィーチャー属性として抽出しない下位XML要素名を列挙します。
-----
devDate fid lfSpanFr loc orgGILvl pos vis
-----
パラメーター設定画面をOKで閉じれば、これらのXML要素 (その下位要素を含む) はフィーチャー属性として抽出されなくなります。

ただし、パラメーターの設定を変更しただけでは、キャンバス画面上のリーダーフィーチャータイプは更新されず、その属性リストには抽出されない属性名も表示されたままです。

Workbench メニュー: Readers > Update Feature Types によって、パラメーターの設定内容を画面上のリーダーフィーチャータイプのインターフェースにも反映させることができます。

FMEワークスペース例: リーダーフィーチャータイプ更新後

0 件のコメント:

コメントを投稿