DfromXml [ -p Xpath ] [ options ] [ input-file.. ]
DfromXmlは, xmlファイルを読んでDレコードを作成する。 出力レコードは,-p xpathオプションで選択された各ノードから作成される。 -pオプションが省略されるた場合のXpathは"//*"となる。 これは,ルートノードを含むすべての階層のすべてのノードを選択する。
各入力ファイルは,正しいXMLファイルでなければならない。 DfromXmlは,各入力ファイルを読み込んで構文解析する。 構文解析でエラーがあると,その入力ファイルから出力レコードは作成されない。 構文解析の後,Xpath式が評価され,各選択ノードからDレコードが作成される。
入力ファイルのエンコーディングは,どんなものでもよい。 出力Dファイルは,カレントロケールの文字コードとなる。 ただし,UTF入出力機能が使われている場合は指定のUTFエンコーディングとなる。 出力文字コードに存在しない文字は,QUESTION MARK(?)に変換される。
XpathはXMLツリーのノードを指定するための言語である。 デフォルトのXpathは"//*"で,ルートノードの下の任意のレベルの任意の要素ノードを意味する。 このデフォルトの出力は,通常目的のものより多すぎる このため,-p xpathオプションによって,求めるノードを選択する。 説明のため,次の例を使用する。
<?xml version="1.0" encoding="UTF-8"?> <doc> /doc <a>text-a /doc/a <a>text-aa /doc/a/a <b>text-aab</b> /doc/a/a/b </a> <b>text-ab</b> /doc/a/b </a> <b>text-b1 /doc/b[1] <a>text-b1a</a> /doc/b[1]/a <b>text-b1b</b> /doc/b[1]/b </b> <b>text-b2 /doc/b[2] <a>text-b2a</a> /doc/b[2]/a <b>text-b2b</b> /doc/b[2]/b </b> </doc>
この例で右の列に示しているのが,その行で始まる要素に対応するXpath式である。
[]でくくられた添え字は,同一レベルの同一名ノードを識別するためにつけられている。 添え字なしであれば,そのレベルの同一名ノードがすべて選択される。 たとえば,Xpath "/doc/b"は, /doc/b[1]と/doc/b[2]との両方を選択する。
ワイルドカード"*"は任意の要素ノードに対応する。 たとえば,"/doc/*"は,/doc/a,/doc/b[1]および /doc/b[2]を選択する。
"//"は,任意個の"/*"またはルート("/")に対応する。 たとえば,"//b"は,/doc/a/a/b,/doc/a/b,/doc/b[1], /doc/b[1]/b,/doc/b[2]および/doc/b[2]/bを選択する。 デフォルトXpath "//*"は,上記例のすべてのノードを選択する。
Xpath言語には他にも多くの演算子や機能があり,それらも使用できる。 ただ,多くの場合,"[]","*"および"//" の使用で用が足りるであろう。
入力XMLファイルが名前空間を使用している場合, Xpathのなかでもプレフィックスを使用しなければならない。 プレフィックスをURIと関連づけるには二つの方法が用意されている。 一つは暗黙宣言で,入力ファイルでのプレフィックス宣言を利用する。 もう一つは明示宣言で,-Nにより関連を宣言する。 入力ファイルが名前空間を使用していて-N optionが指定されていなければ,暗黙宣言が仮定される。
暗黙宣言では,入力ファイル中のタグに現れる形でXpath式を書くことができる。 次の例の右の列にあるような形で,Xpathを書けばよい。
<?xml version="1.0"?> <oai_dc:dc /oai_dc:dc xmlns:oai_dc="http://www.openarchives..." xmlns:dc="http://purl.org/dc/elements..."> <dc:title>DfromXml : D-2.4</dc:title> /oai_dc:dc/dc:title <dc:creator>Akira Miyazawa</dc:creator> /oai_dc:dc/dc:creator </oai_dc:dc>
しかし,入力ファイルがデフォルト名前空間を使用しているとき, 物事はやや複雑になる。
<?xml version="1.0" encoding="UTF-8"?> <OAI-PMH xmlns="http://www.openarchives.org/..."> /D:OAI-PMH <ListRecords> /D:OAI-PMH/D:List <record> /D:OAI-PMH/D:List/D:record ........ </record> </ListRecords> </OAI-PMH>
デフォルト名前空間が使われているタグでは,上例の右の列にあるように,プレフィックス "D:"をつけなければならない。 この例では」,"-p //D:record"というような指定になる。
Xpath言語には,デフォルト名前空間というものはない。 プレフィックスのないXpath式は,入力ファイル中名前空間のスコープからはずれたタグだけを 指定していることになる。 入力ファイルが2つの異なるデフォルト名前空間を使用している場合, DfromXmlは,2番目のデフォルト名前空間をプレフィックス D_ ということにする。次の例の右の列の3番目のXpathを見よ。
<?xml version="1.0"?> <out> /out <in-1 xmlns="http://foo.org" > /out/D:in-1 <in-2 xmlns="http://bar.org"> /out/D:in-1/D_:in-2 </in-2> </in-1> </out>
DfromXmlの暗黙宣言は, プレフィックスの衝突を避ける一般則を決めている。 各入力ファイルごとに,プログラムは入力ドキュメントの名前空間-プレフィックス関係づけ宣言を調べる。 もし,同じプレフィックスに異なる名前空間が関係づけられていた場合,2番目のプレフィックスに LOW LINE (_)を付加して,Xpathでのプレフィックスとする。 3番目のものには2つの(__)を加え,以下同様に処理される。 同じように"D_"は2番目のデフォルト名前空間と関連づけられ, "D__"は3番目と関連づけられる。
明示宣言は,暗黙宣言より単純である。 -Nオプションによって,Xpathで使用するすべてのプレフィックスを宣言する。 -Nオプションのフォーマットは"プレフィックス=URI" で,-Nはいくつあってもよい。 このプレフィックスは-pオプションの中だけで有効で, 入力ファイルでのものと異なっていてもよい。 名前は,プレフィックス-ローカル部分のペアで比較されるのではなく, (プレフィックスに関連づけられた)URI-ローカル部分のペアで比較される。
説明の便宜として, レコードノードは-p xpathで選択された ノードと定義する。
レコードノードの直下のノードは, Dフィールドに変換される。これらのノードをフィールドノードと呼ぶ。 出力Dレコードのフィールド順は,フィールドノードの 入力XMLファイルでの順にしたがう。 フィールドノードの要素名がDフィールド名となり, フィールドノードのもとのテキストを集めたものtがDフィールド値となる。 レコードノードの直下にテキストがあれば, "text"というフィールド名がつけられ,テキストそのものがフィールド値となる。
上例の/doc/aをレコードノードとすると,
<a>text-a
<a>text-aa
<b>text-aab</b>
</a>
<b>text-ab</b>
</a>
DfromXmlは次のDレコードを出力する。
node:/doc/a
text:text-a
a:text-aa text-aab
text:
b:text-ab
text:
"node"フィールドは既定フィールド名フィールドでレコードノードを識別する。 この値は,名前空間が使われていない限り, このノードを選択するXpath式として使用できる。 既定フィールド名の節参照。
"a"フィールドは/doc/a/aノードのテキストと, /doc/a/a/bノードのテキストからなる。 2番目と3番目のtext"は空白文字だけからなる。 これらのフィールドは,終了タグ(たとえば</a>)と 開始タグ(たとえば<b>)との間の改行および行頭空白からなる。 これらのフィールドは無駄に見えるかもしれないが,DfromXmlはXML プロセッサの規約に従って,ドキュメント中のすべての文字をアプリケーションに渡す。 何が不要かを決めるのはアプリケーションで行うこと。 (ただし,/doc/aノードが混合内容でなく,文字データを持てないならば, この例の場合"text-a"がなければ,空白文字だけのtext フィールドは作成されない)。
Dフィールドへの変換ではpredefined entities (<, >, &, ", ') およびcharacter references (一等)を通常の文字に変換することも行われる。
名前空間プレフィックスは,Dフィールド名には反映されない。 Dフィールド名になるのは,ローカル部分だけである。
-rオプションをつけると,出力Dレコードはローモードで出力される。 ローモードでは,Dフィールドの値は,基本的にオリジナルのXMLでのフィールドノード からstart and end tagを取り除いたものとなる。 上の例で使った同じレコードノードから,
<a>text-a
<a>text-aa
<b>text-aab</b>
</a>
<b>text-ab</b>
</a>
DfromXml -rは次のDレコードを出力する。
node:/doc/a
text:text-a
a:text-aa <b>text-aab</b>
text:
b:text-ab
text:
コメントやそのほかの特殊ノードについては特殊ノードの節参照。 entity referencesを含むほとんどのXML constructは,そのまま出力される。 ただし,character referenceは通常の文字に直される。
デフォルトでは,属性は出力に反映されない。 オプション-aにより,属性を出力に反映させることができる。 これには2つの方法がある。 1つは-a fオプションによる属性フィールド出力で, もう1つが-a nオプションによる フィールド名バリエーションである。
オプション-a fによる属性フィールド出力では, 属性を要素のように取り扱い, 属性フィールドとよぶDフィールドを作成する。 属性フィールドのフィールド名は属性名の前に COMMERCIAL AT(@)文字をつけたものとなる。 フィールド値は,属性値を囲んでいる QUOTATION MARK(")を取り除いたものである。 レコードノードまたは フィールドノードの属性だけが 属性フィールドに変換され, その他の属性は,変換されないで捨てられる。 レコードノードの属性フィールドは, ほかのフィールドノードのフィールドより前, nodeフィールドの直後に置かれる。 フィールドノードの属性フィールドは, そのノードのフィールドの直後に置かれる。 次の例を見よ。
<doc lang="en"> <rec a="va" b="vb"> record node <f1 c="vc"> field node <f11 d="vd">value11</f11> <f12 d="vd">value12</f12> </f1> <f2 e="ve">valuef2</f2> field node </rec> </doc>
オプション"-a f"をつけると,次のようなDレコードとなる。
node:/doc/rec
@a:va
@b:vb
f1:value11value12
@c:vc
f2:valuef2
@e:ve
外側のノード(<doc>)や,内側のノード (<f11>, <f12>)の属性は反映されていないことに注意。
オプション-a nによるフィールド名バリエーション では,属性は,Dフィールド名の一部となる。 これは,フィールドノードの属性だけに適用され, レコードノードの属性は無視される。
オプション-a fの典型的な使用法は次のようなものである。
<title lang="en">Algorithms</title>
<title lang="fr">Algorithmique</title>
これらの要素が-a nオプションつきでフィールドノード となると,次のようなDフィールドに変換される。
title-en:Algorithms
title-fr:Algorithmique
さらに"-a nフィールド名仕様"という形式で フィールド名仕様を指定することもできる。 フィールド名仕様は文字列で,要素名の後ろに付加されてDフィールド名を作る。 このとき,フィールド名仕様中の "\a" は属性名で置き換えられ, "\v"は属性値で置き換えられ, "\\"は"\"で置き換えられる。 属性が複数あれば,各属性ごとにこれを行う。 フィールド名仕様がなかった場合デフォルトは"-\v"である。 上記例にあるように,"-en" および"-fr" が要素名 "title"に付加されてDフィールド名となっている。
次の例はフィールド名仕様の説明のための例である。 フィールドノードが次のようなとき,
<field a="va" b="vb">value</field>
オプション"-a n-\a=\v"とするとDfromXmlは,
field-a=va-b=vb:value
を出力する。
XMLには要素や属性以外にいくつかの特殊ノードが存在する。 コメント,processing instructions,CDATA sections,entity referencesである。 次のテーブルは,それらが出力Dレコードにどのように反映されるかを示す。
ノード | フィールドノード中 | フィールドノード中(ローモード) | フィールドノード | フィールドノード(ローモード) |
---|---|---|---|---|
comment <!--text--> |
出力なし | <!--text--> | comment:text | comment:<!--text--> |
processing instruction <?target instruction?> |
出力なし | <?target instruction?> | PI:target instruction | PI:<?target instruction?> |
CDATA section <![CDATA[text]]> |
text | <![CDATA[text]]> | CDATA:text | CDATA:<![CDATA[text]]> |
entity reference &name; |
replacement text | &name; | ENTITY:name | ENTITY:&name; |
これらのノードがレコードノードとして選択されることは普通ない。 ただし,レコードノードとなったときは,フィールドノードの場合と同様に扱われる。
もっとも単純な使用法では,デフォルトXpath "//*" で,すべての要素ノードからDレコードを作る。
DfromXml foo.xml
OAI-PMH (Open Archives Initiative Protocol for Metadata Harvesting) のレスポンス(OAI-PMHの例示フォーマット)から,ダブリンコアメタデータを取り出す。
DfromXml -p //oai_dc:dc response.xml
デフォルト名前空間を一つだけ使っているXMLファイルから<record>ノードを選択する。
DfromXml -p //D_:record bar.xml
MIYAZAWA Akira