John Squirrels
レベル 41
San Francisco

JavaのXML

ランダム グループに公開済み
やあ!今日は、XML と呼ばれる別のデータ形式を紹介します。これは非常に重要なトピックです。実際の Java アプリケーションで作業する場合、ほぼ確実に XML 関連のタスクに遭遇することになります。Java 開発では、この形式はほぼ普遍的に使用されます (その理由は後述します)。そのため、このレッスンを表面的に復習するのではなく、すべてを徹底的に理解し、追加の文献/リンクも学習することをお勧めします :)決して時間の無駄ではありません。それでは、「何を」と「なぜ」という簡単なことから始めましょう。

Java XML とは何ですか?

XML は eXtensible Markup Language の略です。マークアップ言語についてはすでによくご存知かもしれません。Web ページの作成に使用される HTML について聞いたことはありますか :) XML とは何ですか?  - 1HTML と XML は見た目も似ています。
HTML1

<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML1

<headline>title</headline>
<paragraph>paragraph<paragraph>
<paragraph>paragraph<paragraph>
HTML2

<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML2

<chief>title</chief>
<paragraph>paragraph<paragraph>
<paragraph>paragraph<paragraph>
つまり、XML はデータを記述するための言語です。

なぜ XML が必要なのでしょうか?

XML はもともと、インターネット経由などでデータをより便利に保存および送信するために発明されました。これを達成するのに役立ついくつかの利点があります。まず、人間にもコンピュータにも読みやすいということです。この XML ファイルが何を説明しているかは簡単に理解できると思います。

<?xml version="1.0" encoding="UTF-8"?>
<book>
   <title>Harry Potter and the Philosopher’s Stone</title>
   <author>J. K. Rowling</author>
   <year>1997</year>
</book>
コンピュータもこの形式を容易に理解できます。第 2 に、データはプレーン テキストとして保存されるため、あるコンピュータから別のコンピュータに転送するときに互換性の問題が発生しません。XML は実行可能コードではなく、データ記述言語であることを理解することが重要です。XML を使用してデータを記述した後、このデータを送信/受信/処理できるコード (たとえば、Java で) を記述する必要があります。

XMLはどのように構造化されているのでしょうか?

主なコンポーネントはタグです。山括弧内にあるものは次のとおりです。

<book>
</book>
開始タグと終了タグがあります。上の例に見られるように、終了タグには追加の記号 (「/ 」) があります。各開始タグには終了タグが必要です。これらは、ファイル内の各要素の説明がどこで始まり、どこで終わるかを示します。タグはネストできる!この本の例では、<book> タグには、<title>、<author>、<year> という 3 つのネストされたタグがあります。これは 1 レベルのネストに限定されません。ネストされたタグは独自のネストされたタグを持つこともできます。この構造はタグ ツリーと呼ばれます。自動車販売店を説明するサンプル XML ファイルを使用して、このツリーを見てみましょう。

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
ここにはトップレベルのタグ <carstore> があります。ルート要素とも呼ばれます。<carstore> には 1 つの子タグ <car> があります。<car> には、<model>、<year>、<price> という 3 つの子タグもあります。各タグには、追加の重要な情報を含む属性を含めることができます。この例では、<model> タグには「lang」属性があり、モデル名の記録に使用される言語を示します。

<model lang="en">Scania R 770</model>
ここでは名前が英語で書かれていることを示します。<price> タグには「currency」属性があります。

<price currency="US dollar">150000.00</price>
ここでは、車の価格が米ドルで表示されていることを示します。したがって、XML には「自己記述型」構文があります。データを説明するために必要な情報を追加できます。さらに、ファイルの先頭に、XML バージョンとデータの書き込みに使用されるエンコーディングを示す行を追加できます。これは「プロローグ」と呼ばれ、次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
XML バージョン 1.0 と UTF-8 エンコーディングを使用しています。これは必須ではありませんが、たとえば、ファイルで異なる言語のテキストが使用されている場合に便利です。XML が「eXtensible Markup Language」を意味すると述べましたが、「拡張可能」とは何を意味するのでしょうか? これは、オブジェクトやファイルの新しいバージョンを作成するのに最適であることを意味します。たとえば、自動車ディーラーでオートバイの販売も開始したいとします。そうは言っても、プログラムは <carstore> の古いバージョン (オートバイなし) と新しいバージョンの両方をサポートする必要があります。古いバージョンは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
そして、これが新しく拡張されたものです:

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
   <motorcycle>
       <title lang="en">Yamaha YZF-R6</title>
       <year>2018</year>
       <price currency="Russian Ruble">1000000.00</price>
       <owner>Vasia</owner>
   </motorcycle>
   <motorcycle>
       <title lang="en">Harley Davidson Sportster 1200</title>
       <year>2011</year>
       <price currency="Euro">15000.00</price>
       <owner>Petia</owner>
   </motorcycle>
</carstore>
このように、オートバイの説明をファイルに追加するのは非常に簡単でシンプルです :) さらに、オートバイには車と同じ子タグを持たせる必要はまったくありません。自動車とは異なり、オートバイには <owner> 要素があることに注意してください。これは、コンピュータ (または人間) によるデータの読み取りを妨げるものではありません。

XML と HTML の違い

XML と HTML は見た目が非常に似ていることはすでに述べました。したがって、それらがどのように異なるかを知ることが非常に重要になります。まず、それらはさまざまな目的に使用されます。HTML は Web ページをマークアップするためのものです。たとえば、Web サイトを作成するときに、HTML を使用して、「メニューは右上隅にある必要があります。これこれのボタンが必要です」と指定できます。言い換えれば、HTML の仕事はデータを表示することです。XML は、人間とコンピュータにとって便利な形式で情報を保存および送信するためのものです。この形式には、このデータをどのように表示するかについての指示は含まれていません。それは、データを読み取るプログラムのコードによって異なります。第二に、大きな技術的な違いがあります。HTML タグは事前に定義されています。つまり、HTML ヘッダー (ページ上部の大きなキャプションなど) の作成には、<h1></h1> のみが使用されます。タグ (<h2></h2> と <h3></h3> は小さいヘッダーに使用されます)。他のタグを使用して HTML ヘッダーを作成することはできません。XML では事前定義されたタグは使用されません。タグには、<header>、<title>、<idontknow2121> などの任意の名前を付けることができます。

紛争解決

XML が提供する自由度は、いくつかの問題を引き起こす可能性があります。たとえば、まったく同じエンティティ (車など) をプログラムで異なる目的に使用することができます。たとえば、車について説明する XML ファイルがあります。しかし、当社のプログラマーたちは事前の合意に達しませんでした。そして今では、実際の車に関するデータに加えて、おもちゃの車に関するデータも XML で見つかる可能性があります。さらに、それらは同じ属性を持っています。プログラムがそのような XML ファイルを読み取るとします。本物の車とおもちゃの車をどうやって見分けるのでしょうか?

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">100.00</price>
   </car>
</carstore>
ここでプレフィックスと名前空間が役に立ちます。私たちのプログラムでは、おもちゃの車と本物の車を区別するために (実際、あらゆるおもちゃと本物のおもちゃも)、「本物」と「おもちゃ」という 2 つの接頭辞を導入します。

<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
これで、プログラムはさまざまなエンティティを区別できるようになります。toy プレフィックスが付いているものはすべておもちゃとして扱われます :) ただし、まだ完了していません。プレフィックスを使用するには、それぞれを名前空間として登録する必要があります。実際、「登録」は強力な単語です :) 必要なのは、それぞれに一意の名前を考えるだけです。これはクラスの場合と似ています。クラスには短い名前 ( Cat ) と、すべてのパッケージを含む完全修飾名 ( zoo.animals.Cat ) があります。)。通常、URI は一意の名前空間名を作成するために使用されます。場合によっては、これはインターネット アドレスを使用して行われ、この名前空間の機能が記述されます。ただし、有効なインターネット アドレスである必要はありません。多くの場合、プロジェクトでは、名前空間階層の追跡に役立つ URI のような文字列が単純に使用されます。以下に例を示します。

<?xml version="1.0" encoding="UTF-8"?>
<carstore xmlns:real="http://testproject.developersgroup1.companyname/department2/namespaces/real"
         xmlns:toy="http://testproject.developersgroup1.companyname/department2/namespaces/toy">
<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
</carstore>
もちろん、「http://testproject.developersgroup1.companyname/Department2/namespaces/real」という Web サイトはありません。しかし、この文字列には有益な情報が含まれています。部門 2 のグループ 1 の開発者が「実際の」名前空間を作成する責任があります。 。新しい名前を導入する必要がある場合、または競合の可能性について話し合う必要がある場合、どこに頼るべきかがわかります。開発者は、実際のわかりやすい Web アドレスを一意の名前空間名として使用することがあります。たとえば、世界中の何百万人もの人々がそのプロジェクトを使用する大企業がこれに当てはまります。しかし、これは常に行われるわけではありません。Stack Overflowでこの問題について議論されています。一般に、名前空間名として URI を使用するという厳密な要件はありません。単純にランダムな文字列を使用することもできます。このオプションも機能します:

xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
とはいえ、URI を使用するといくつかの利点があります。詳細については、こちらをご覧ください。

基本的な XML 標準

XML 標準は、XML ファイルに追加機能を追加する一連の拡張機能です。XML には多くの標準がありますが、最も重要な標準だけを見ていき、これらの標準によって、最も有名な XML 標準の 1 つである AJAX が可能になることがわかります。Web ページをリロードせずにコンテンツを変更できます。XSLT を使用すると、XML テキストを他の形式に変換できます。たとえば、XSLT を使用して XML を HTML に変換できます。すでに述べたように、XML の目的はデータを表示することではなく、データを記述することです。しかし、XSLT を使用すると、この制限を回避できます。XML DOM を使用すると、XML ファイルから個々の要素を取得、変更、追加、または削除できます。これがどのように機能するかを示す小さな例を次に示します。Books.xml ファイルがあります。

<bookstore>
   <book category="cooking">
       <title lang="en">Everyday Italian</title>
       <author>Giada De Laurentiis</author>
       <year>2005</year>
       <price>30.00</price>
   </book>
   <book category="children">
       <title lang="en">Harry Potter</title>
       <author>J. K. Rowling</author>
       <year>2005</year>
       <price>29.99</price>
   </book>
</bookstore>
2冊の本があります。書籍には <title> 要素があります。ここでは、JavaScript を使用して XML ファイルからすべての本のタイトルを取得し、最初のタイトルをコンソールに出力できます。

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
  myFunction(this);
  }
};
xhttp.open("GET", "books.xml", true);
xhttp.send();

function myFunction(xml) {
    var xmlDoc = xml.responseXML;
  document.getElementById("demo").innerHTML =
  xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;
}
</script>

</body>
</html>
DTD (「文書型定義」) を使用すると、XML ファイル内のエンティティに許可される要素のリストを定義できます。たとえば、書店の Web サイトで作業していて、XML ファイル内の book 要素にはタイトル、著者、年の属性のみを指定することにすべての開発チームが同意しているとします。しかし、不注意から身を守るにはどうすればよいでしょうか? 非常に簡単!

<?xml version="1.0"?>
<!DOCTYPE book [
       <!ELEMENT book (title,author,year)>
       <!ELEMENT title (#PCDATA)>
       <!ELEMENT author (#PCDATA)>
       <!ELEMENT year (#PCDATA)>
       ]>

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
</book>
ここでは、<book> の有効な属性のリストを定義しました。そこに新しい要素を追加しようとすると、すぐにエラーが発生します。

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
   <mainhero>Frodo Baggins</mainhero>
</book>
エラー!「ここでは mainhero 要素は許可されません」 他にも多くの XML 標準があります。それぞれについてよく理解し、コードをさらに深く掘り下げてみてください。とにかく、XML に関する情報が必要な場合は、ほとんどすべての情報を見つけることができます :) これで、レッスンは終了です。タスクに戻る時間です! :) 次回まで!
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION