XML
2016/08/15
XSLTを使うことはなくなりましたが、XPathは今でも出会います。
最低限おさえておきたいXML用語
XHTMLがHTML5に、SOAPがREST Apiに、設定ファイルもJSONが増えてきたりですっかり影が薄くなったXMLですが、aspxやXAMLやOpenXMLでまだ現役みたいなので。NameSpace(名前空間)
.NetにおけるNameSpaceとほぼ同じ役割。たまたま名前がかぶってもNameSpaceが違えば識別可能。グローバルにユニークになるように、自ドメイン名を含める(http://で始まるURLっぽいものになっている)ことが多いが、下記のDTDとは違いそこにはページは存在しない。
XAMLでの例
xmlnsで始まっているのがNameSpace。
1行目のx:Classのxや最後の行のx:Nameのxは上で定義されているhttp://schemas.microsoft.com/winfx/2006/xamlのこと。
デフォルトのNameSpace
プレフィックス(上の例ではx:)の付かないxmlnsでの指定は、プレフィックスの付かないすべてのエレメントにかかる。<?xml version="1.0"> <family xmlns="鈴木家" xmlns:y="山田家"> <太郎 /> <花子 /> <y:太郎 /> </family>一番上の太郎さんは鈴木家の太郎さん、2番目の花子さんも鈴木家の花子さん、3番目の太郎さんは山田家の太郎さん。
NameSpaceを無視する(Local Name)
同姓同名でも住所(NameSpace)が違えば全く別人ですが、あえてNameSpaceを無視したい時もある。全国の山田さん抽出みたいな?LINQ | エレメントのLocalNameプロパティ |
XPath | local-name() 関数 |
Element(要素)
開始タグと終了タグ、それらに囲まれたコンテンツを含む。下記全体がElement。<record>ABC</record>
Node(ノード)
Elementよりも範囲が広い。ElementもNodeの一つ。他にAttributeやTextもNodeに含まれる。Attribute(属性)
Elementのプロパティ。開始タグに 属性名="属性値" のペア形で追加する。HTMLの場合は width=123 と言うような記述もエラーにならないけれどXMLの場合は必ず width="123" のようにダブルコーテーションあるいはシングルコーテーションで囲む。
<record id="1" category="alphabet">ABC</record>
Root element(ルート要素)
XMLのRoot element(一番外側の要素)は一つだけ。下記のようなXMLはエラーになる。<?xml version="1.0"?> <record>ABC</record> <record>DEF</record> <record>HIJ</record>ルート要素(下記例の場合は:data)の開始タグと終了タグでくるむ必要がある。
<?xml version="1.0"?> <data> <record>ABC</record> <record>DEF</record> <record>HIJ</record> </data>
CDATA
character dataの略。<body> <![CDATA[この中には<b>タグ</b>を書くことができます。<br /> 言い換えるとXMLパーサーによって解釈されないためエンティティも展開されません。 ]]> </body>
Valid XML(妥当なXML)
DTD(Document Type Definition)に適合したXMLである。下記の例はWell-Formed XMLですがValid XMLではありません。
bodyの子要素としてXHTML 1.0 Transitionalで定義されている中にfontは存在しません。
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <body> <font sytle='color:red;'> <b>重要!</b> </font> </body> </html>
Well-Formed XML(整形式のXML)
DTDが無かったりDTDに照らし合わせると妥当ではなかったとしてもXML文書としては正しい形式のもの。定義はおいといてパーサーにXML文書として認めてもらうにはただ一つだけのルート要素を持つ
上記参照開いたタグは必ず閉じる
終了タグを省略しない。コンテンツを持たない場合は開始タグの最後に / を付けて自己終了(selfe close)させる。
<br /> <hr />大文字、小文字を区別します。下記はエラーになります。
<body>エラーになります</Body>
タグを入れ子にする場合は最後に開いたタグを最初に閉じる
<span sytle="color:red;"><em>こちらはXMLではエラーになります</span></em> <span sytle="color:red;"><em>きれいに対になっている必要があります</em></span>
Attribute(属性)の値は必ずコーテーションで囲む
ダブルコーテーションもしくはシングルコーテーションで囲む。<img src="special.png" alt="おすすめ!" />
Attribute(属性)値を省略できない
この制約のおかげでXHTMLでは下記のような記述が必要に。<input type="checkbox" checked="checked" />
ENTITY(エンティティ:実体)
定義はDTDで<!ENTITY エンティティ名 "呼び出される実体">参照は &エンティティ名;
目的は大きく二つ。
テキスト部分に直接記述できない文字や記号を定義する
HTMLソースをXMLとして読み込んだ場合に<や のような実体参照が含まれていてエラーになる場合はDTDでエンティティを定義しておく。<!ENTITY lt "<"> <!ENTITY gt ">"> <!ENTITY nbsp " ">
繰り返し使うものを一箇所で定義しておく
<!ENTITY phone "000-0000-0000"> お問い合わせは☎まで。
- 覚えにくいものを覚えやすいキーワードに
- 繰り返し使われる長い文字列を短いキーワードに(ファイルサイズが小さくなる)
- 変化する可能性のあるものを一箇所で定義
文字コード
デフォルトはUTF-8。<?xml version="1.0"?>は下記と同じ。
<?xml version="1.0" encoding="utf-8"?>
DTD(Document Type Definition)
XMLの構造のルールを定義した文書型定義。スキーマ言語のひとつ。Visual StudioのXMLエディタでインテリセンスの機能をサポートするために使われているのはXML Schema(.xsd)の方。
Visual StudioでDTDをXML Schemaに変換するにはDTDファイルあるいはDTDの含まれるXMLファイルをVisual Studioで開き、メニューからXML(X)→スキーマの作成(C)を選択。
さらにXML SchemaからC#のクラスに変換する場合はxsd.exeを使います。
VS2017の場合のインストール場所。