1. ホーム
  2. Web プログラミング
  3. XML/RSS
  4. XMLの例

Xml入門_Power Node Java Academy

2022-01-17 19:01:30

XML (入門)

       XML(Extensible Markup Language)は、1990年代後半に登場して以来、多くの活動や熱狂的な考察の焦点となっている。XMLは単なるテキストをベースにしていますが、ほとんどすべての2つのアプリケーション間でデータを共有する方法を提供します。

       XMLは概念的にはシンプルですが、XMLを使った作業は面倒(コードの繰り返しが多い)かつ複雑(見落としがちな部分が多くエラーになりやすい)なことが多いのです。     

XMLはいつ使うのか?

       WebアプリケーションでXMLを使用するタイミングは?

  • すでにXMLで保存されているデータを扱う必要がある場合。
  • データをXMLで保存し、将来の統合に備えたい場合。(アプリケーション統合のシナリオでは、XMLが最も理にかなっています。)
  • XMLに依存する技術を使用したい場合。(Webサービスでは、XMLをベースにしたさまざまな標準が使用されています。)
  • アノテーションです。
  •        理解しておかなければならない重要な概念は、データを保存する際に2つのことを決めなければならないということである。
  • データをどのように構造化するか(論理フォーマット)を決める
  • データの保存方法を決定する(物理的な保存方法)

 XMLは、保存方法の選択というより、フォーマットの選択です。つまり、XMLでデータを保存すると決めたとしても、それをデータベースのフィールドに保存するか、ファイルに挿入するか、あるいは単に文字列やその他のオブジェクトとしてメモリ内に保持するかを決めなければなりません。

XML入門

       XML仕様とは、W3C(World Wide Web Consortium)が定義した、構造化されたデータをプレーンテキストで記述するためのガイドラインのことで、カギカッコで囲まれたタグに基づくマークアップ言語である。

       XMLには決まったタグがあるわけではありません。その代わり、XMLは他のマークアップ言語を作成するために使用できるメタ言語である。

       次の文書は、商品カテゴリーを保持するためのカスタム XML フォーマットを示しています。

<?xml version="1.0" encoding="utf-8" ? >
<productCatalog>
 <catalogName>Acme Fall 2015 Catalog</catalogName>
 <expiryDate>2015-01-01</expiryDate>
 <products>
  <product id="1001">
   <productName>Magic Ring</productName>
   <productPrice>342.10</productPrice>
   <inStock>true</inStock>
  </product>
  <product id="1002">
   <productName>Flying Carpet</productName>
   <productPrice>982.99</productPrice>
   <inStock>true</inStock>
  </product>
 </products>
</productCatalog>

       タグは、データを最もよく表す名前を自由に使うことができ、この柔軟性がXMLを成功に導いているのです。もちろん、柔軟性には欠点もあります。また、すべてのアプリケーションでXMLデータを解析することができますが、データの書き手と読み手がデータを解釈し、意味のある情報を抽出するためには、タグと構造について合意しておく必要があります。 

XMLのメリット

       今日、XMLは過去のどの時代よりも有用である。現代のアプリケーションにXMLを使用する利点は以下の通りです。

  • <強い 適応性 XMLはどこにでもあり、データを共有する必要があるときはいつでも、XMLがターゲットとして選ばれます。
  • <強い 拡張性・柔軟性 XMLはデータのセマンティクスにルールを課さず、あらゆる種類のデータに対応し、実装も安価です。
  • 関連規格・ツール XMLの成功のもう一つの理由は、XMLを作成・処理するためのツール(パーサー)と関連する標準(XMLスキーマ、XPath、XSLT)である。これにより、ほとんどすべての言語の開発者が、XMLの読み込み、特定のルール(アーキテクチャと呼ばれる)に従ったXMLの検証、XMLのフォーマットへの変換などのための既製のコンポーネントを利用できるようになりました。 

整形されたXML

       XMLは非常に厳格な規格であり、この厳格さによって幅広い互換性が保たれている。(悪名高いHTML言語は、この厳密性の規格がないために生まれたものです)。

       すべてのXMLパーサーは、いくつかの基本的な品質チェックを行います。XML 文書がすべての基準を満たさない場合、その文書は完全に拒否されます。そうでない場合は、整形式とみなされる。整形式の XML は必ずしも正しい XML ではない。例えば、不正確なデータを含むが、XML パーサーはこれを解析することができる。

       XML文書が整形式とみなされるには、以下の条件を満たす必要があります。

  • 各開始タグには、対応する終了タグが必要です
  • 空の要素は "/>" で終わらなければなりません。
  • 要素のネストは可能だが、インターリーブは不可
  • XMLは大文字と小文字を区別するため、 <FirstName> と </firstName > を対にすることはできません。
  • 1つの要素に同名の属性を2つ以上持つことはできませんが、同名の要素を複数入れ子にすることは可能です。
  • 1つの文書は1つのルート要素しか持つことができない
  • すべてのフィーチャーは、値の前後に引用符で囲む必要があります。
  • タグの中にコメントを入れることはできません(<! --と-->タグに含まれます) 

XML名前空間

       XMLの標準化が進むにつれて、何十種類ものXMLマークアップ言語(XML構文と呼ばれることもある)が生み出されてきた。これらの多くは、特定の業界、プロセス、情報タイプに属しています。同じ名前要素を持つ2つのXML構文を同時に組み合わせる必要がある場合、どうなるでしょうか?また、より典型的な問題として、両者をどのように区別すればよいのでしょうか。

       その解決策は、XML名前空間規格にある。この規格の核となる考え方は、すべてのXMLマークアップ言語が、関連する要素を一意に区別する名前空間を持つというものである。簡単に言えば、名前空間は、同じ名前の要素を統合する際に曖昧さをなくします。

       XMLの名前空間はすべてURI(Universal Resource Identifiers)を使用し、一般にWebページのURLと似たような形をしています。例えば http://www.mycompany.com/mystandard  は典型的な名前空間であるが、これは必須ではなく(仮定する必要もない)、名前空間はどのようなテキストの並びでもよく、一意であることを保証することが標準とされる。

       ある要素が特定の名前空間に属することを指定するには、開始タグにxmlns(XML Name Space)機能を追加して、使用する名前空間を示すだけです。例えば、次のような要素は http://mycompany/OrderML  の部分は、名前空間の一部です。

<order xmlns="http://mycompany/OrderML"></order>
    You'll be tired of the tedious operation of adding this feature to all elements; fortunately, if you add the namespace like the following, it will become the default namespace for all child elements.
<product xmlns="http://mycompany/OrderML">
 <productName>Flying Carpet</productName>
 <productPrice>982.99</productPrice>
 <inStock>true</inStock>
</product>
    You can also customize the namespace prefix by inserting a colon and a character you want to use as a prefix in the xmlns feature: <ord:order
<ord:order xmlns:ord="http://mycompany/OrderML"
      xmlns:cli="http://mycompany/ClientML">
 <cli:client>
  <cli:firstName>... </cli:firstName>
  <cli:lastName>... </cli:lastName>
 </cli:client>
 <ord:orderItem>... </ord:orderItem>
 <ord:orderItem>... </ord:orderItem>
</ord:order>

XMLアーキテクチャ

       XMLの柔軟性には、いくつかの疑問もあります。世界中の開発者があなたのXMLフォーマットを使っているのに、全員がそのルールに従うことをどうやって保証するのでしょうか?

       その解決策は、独自のマークアップ言語のルールを定義したフォーマット文書を作成することです。これはアーキテクチャと呼ばれます。これらのルールには構文の詳細は含まれません(これはXML標準が規定するものです)。アーキテクチャ文書が定義する必要があるのは、データ型にマッチした論理ルールで、次のようなものが含まれます。

  • 文書ボキャブラリー . XML文書に出現する要素名や機能名を定義するものです。
  • 文書構造 . タグを配置する場所を定義し、タグ間の順序を指定し、要素の出現回数を指定することができる。
  • 対応するデータ型 . データをテキストとして定義することも、パース可能な数値データ、日付情報などである必要があります。
  • 使用可能なデータ範囲 . 値を範囲指定したり、テキストを特定の長さに制限したり、正規表現のパターンマッチを強制したり、特定の特定の値のみに制限したりすることができます。

       次のXMLスキーマは、先に示した商品分類ルールを定義するものである。

<?xml version="1.0" encoding="utf-8"? >
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <xsd:element name="productCatalog">
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element name="CatalogName" type="xsd:string" />
    <xsd:element name="expiryDate" type="xsd:date" />
    <xsd:element name="products">
     <xsd:complexType>
      <xsd:sequence>
       <xsd:element name="product" type="productType" maxOccurs="unbounded" />
      </xsd:sequence>
     </xsd:complexType>
    </xsd:element>
   </xsd:sequence>
  </xsd:complexType>
 </xsd:element>
 <xsd:complexType name="productType">
  <xsd:sequence>
   <xsd:element name="productName" type="xsd:string" />
   <xsd:element name="productPrice" type="xsd:decimal" />
   <xsd:element name ="inStock" type="xsd:boolean" />
  </xsd:sequence>
  <xsd:attribute name="id" type="xsd:integer" use="required" />
 </xsd:complexType>
</xsd:schema>

  • すべてのアーキテクチャ文書は、ルート要素 <schema> で始まる XML 文書である。
  • 利用可能なすべての要素は、XMLスキーマ空間にすでに定義されています ( http://www.w3.org/2001/XMLSchema )
  • アーキテクチャ文書では、正しい名前空間名を使用する必要があります(接頭辞は通常 xsd または xs ですが、カスタマイズも可能です)。
  • <schema>要素内では、以下の2種類の定義があります。
  • <element>は、ターゲット文書が従うべき構造を定義します。
  • <complexType> ドキュメント構造がより小さいデータ構造を定義します。
  • <element> このタグは構造の中核であり、すべての検証の出発点でもあります。

       この例では、<element>タグは、商品カテゴリが<productCatalog>というルート要素で始まる必要があることを特定しています。productCatalog>要素の内部は、3つの要素で構成されています。1つ目はプレーンテキストを含む <catalogName> 、2つ目は日付の表示規則に一致するテキストを含む <expiryDate> 、3つ目は <product> のリストを含む <products> である。

       それぞれの <products> 要素は複合型なので、後で再び <complexType> を使ってドキュメントを定義することになります。この複合型(<productType>という名前)は、商品に関する情報を含む3つの要素のシーケンスで構成されています。これらの要素はそれぞれ、テキスト(<productName>)、10進数(<productPrice>)、ブール値(<inStock>)を保持しています。この複合型は、必須の特性IDも含んでいる。