XML

2016/08/15
XML,XPath,XSLT,XHTML
XSLTを使うことはなくなりましたが、XPathは今でも出会います。

最低限おさえておきたいXML用語

XHTMLがHTML5に、SOAPがREST Apiに、設定ファイルもJSONが増えてきたりですっかり影が薄くなったXMLですが、aspxやXAMLやOpenXMLでまだ現役みたいなので。

NameSpace(名前空間)

.NetにおけるNameSpaceとほぼ同じ役割。たまたま名前がかぶってもNameSpaceが違えば識別可能。
グローバルにユニークになるように、自ドメイン名を含める(http://で始まるURLっぽいものになっている)ことが多いが、下記のDTDとは違いそこにはページは存在しない。
XAMLでの例
xamlns020.png

xmlnsで始まっているのがNameSpace。
1行目のx:Classのxや最後の行のx:Nameのxは上で定義されているhttp://schemas.microsoft.com/winfx/2006/xamlのこと。
NameSpaceを無視する(Local Name)
同姓同名でも住所(NameSpace)が違えば全く別人ですが、あえてNameSpaceを無視したい時もある。全国の山田さん抽出みたいな?
LINQエレメントのLocalNameプロパティ
XPathlocal-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として読み込んだ場合に&lt;や&nbsp;のような実体参照が含まれていてエラーになる場合はDTDでエンティティを定義しておく。
<!ENTITY lt "&#60;">
<!ENTITY gt "&#62;">
<!ENTITY nbsp " ">
繰り返し使うものを一箇所で定義しておく
<!ENTITY phone "000-0000-0000">

お問い合わせは&phone;まで。
  • 覚えにくいものを覚えやすいキーワードに
  • 繰り返し使われる長い文字列を短いキーワードに(ファイルサイズが小さくなる)
  • 変化する可能性のあるものを一箇所で定義

文字コード

デフォルトは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)を選択。
dtd2xsd010.png


さらにXML SchemaからC#のクラスに変換する場合はxsd.exeを使います。
VS2017の場合のインストール場所

リンク

OK キャンセル 確認 その他