バナー画像

XMLとは?

XML(Extensible Markup Language)とは、任意の用途向けにデータ構造をシンプルに表現したマークアップ言語です。

マークアップ言語とは、タグと値のセットで構成され、文章を構造化する言語ですね。

Webサイト作成で使われる HTML がよく聞くマークアップ言語です。

HTMLがWebサイトの情報を記述するる言語に対し、XMLはデータ交換のための汎用のデータ形式となっています。

XMLの主な特徴
  • インターネット上での使いやすさ
  • 広くさまざまなアプリケーションをサポート
  • XML文書を処理するプログラムを簡単に記述可能
  • オプション機能を可能な限りゼロに
  • 規則に従っており簡潔である
  • 読みやすくて分かりやすい
  • すぐに作成可能

これらの特徴があるのがXMLです。

XMLドキュメントとは?

XMLドキュメントは、その名の通りXMLで書かれた文書のことです。

タグと値のセットで文書を記述していきます。

文書の記述ルールは下記の通りです。

<要素名 属性=”値”>内容</要素名>

要素名のタグ <要素名> を用意し、この中に内容・値を記述します。

要素名には属性も付けられるようになっています。

そして、 </要素名> で要素タグを閉じます。

これらのルールに則って、記述したXML文書のサンプルが下記の通りです。

<?xml version="1.0" encoding="UTF-8" ?>
<ProgramingList>
 <Language id="001" name="Java">Javaは標準的なプログラミング言語です</Language>
 <Language id="002" name="C言語">C言語はプログラミング言語の中でも非常に知名度の高いプログラミング言語です</Language>
 <Language id="003" name="PHP">PHPは動的にWebページを生成できるプログラミング言語です</Language>
 <Language id="004" name="Python">Pythonはインタープリタ型の高水準汎用プログラミング言語です</Language>
 <Language id="005" name="Ruby">Rubyは日本で開発されたプログラミング言語です</Language>
</ProgramingList>

JavaでXMLを読み込む方法とサンプル

XMLはJavaでも読み込むことができます。

読み込むためには、専用のAPI(Application Programming Interface)を使うことが必要です。

JavaでXMLを読み込む際に使う主なAPIには、下記の4種類があります。

JavaでXMLを読み込むAPI
  • DOM(Document Object Model)
  • SAX(Simple API for XML Processing)
  • StAX(Streaming API for XML)
  • XPath(XML Path Language)

それぞれについて、簡単に説明します。

DOM(Document Object Model)

DOMは、要素がノードで表現され、ノードの関係がノードツリーで表現されたものです。

ノードは節や集合点といった意味の言葉ですね。

ツリー構造は、パソコン内のフォルダやファイルにも使われている表現方法で、これを用いた要素の検索と操作が得意とされています。

■記述例

import java.nio.file.Paths;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class DomSample {
    public static void main(String[] args) throws Exception {
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = factory.newDocumentBuilder();
      Document document = builder.parse(Paths.get("languageList.xml").toFile());
      Element languageList = document.getDocumentElement();
      NodeList languages = languageList.getElementsByTagName("Language");

      for (int i = 0; i < languages.getLength(); i++) {
        Element language = (Element) languages.item(i);
        String id = language.getAttribute("id");
        String name = language.getAttribute("name");
        String content = language.getTextContent();
        System.out.println("id = " + id);
        System.out.println("name = " + name);
        System.out.println("text = " + content);
        System.out.println();
      }
    }
}
■実行結果
mbp:desktop potepan$ java Main
id = 001
name = Java
text = Javaは標準的なプログラミング言語です

id = 002
name = C言語
text = C言語はプログラミング言語の中でも非常に知名度の高いプログラミング言語です

id = 003
name = PHP
text = PHPは動的にWebページを生成できるプログラミング言語です

id = 004
name = Python
text = Pythonはインタープリタ型の高水準汎用プログラミング言語です

id = 005
name = Ruby
text = Rubyは日本で開発されたプログラミング言語です

SAX(Simple API for XML Processing)

SAXは、先頭から順番に要素を1つずつイベントの連続として読み込むものです。

これによって、プログラムはイベントに合わせて要素や属性を受け取り、イベントに対応するメソッドで処理ができるようになっています。

必要な要素の情報を簡単に取得できる特徴がある一方で、XMLのツリー構造を意識したプログラミングは難しいとされています。

■記述例
import java.nio.file.Paths;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXSample extends DefaultHandler {
  String id;
  String name;
  String text;

  public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    if ("Language".equals(qName)) {
      id = attributes.getValue("id");
      name = attributes.getValue("name");
    }
  }

  public void characters(char[] ch, int start, int length) throws SAXException {
    text = new String(ch, start, length);
  }

  public void endElement(String uri, String localName, String qName) throws SAXException {
    if ("Language".equals(qName)) {
      System.out.println("id = " + id);
      System.out.println("name = " + name);
      System.out.println("text = " + text);
      System.out.println();
    }
  }

  public static void main(String[] args) throws Exception {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser parser = factory.newSAXParser();
    SAXSample handler = new SAXSample();
    parser.parse(Paths.get("languageList.xml").toFile(), handler);
  }
}
■実行結果
mbp:desktop potepan$ java Main
id = 001
name = Java
text = Javaは標準的なプログラミング言語です

id = 002
name = C言語
text = C言語はプログラミング言語の中でも非常に知名度の高いプログラミング言語です

id = 003
name = PHP
text = PHPは動的にWebページを生成できるプログラミング言語です

id = 004
name = Python
text = Pythonはインタープリタ型の高水準汎用プログラミング言語です

id = 005
name = Ruby
text = Rubyは日本で開発されたプログラミング言語です

StAX(Streaming API for XML)

StAXは、SAXと同じくイベント連続として読み込むものです。

SAXとの違いは、イベントの取り扱い方ですね。

StAXはPull型であり、イベントの種類をStAXのクラスに問い合わせ、必要な処理を自身で呼び出します。

SAXよりも制限が緩く、決まったクラスやインターフェイスを継承・実装する必要がないという特徴があります。

■記述例
import java.io.FileInputStream;
import java.nio.file.Paths;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;

public class StAXSample {
 public static void main(String[] args) throws Exception {
   XMLStreamReader reader = null;

   try {
     XMLInputFactory factory = XMLInputFactory.newInstance();
     reader = factory.createXMLStreamReader(new FileInputStream(Paths.get("languageList.xml").toFile()));
     String id = null;
     String name = null;
     StringBuilder text = new StringBuilder();

     while (reader.hasNext()) {
       int eventType = reader.next();

       switch (eventType) {
         case XMLStreamConstants.START_ELEMENT:
         if ("Language".equals(reader.getName().getLocalPart())) {
           id = reader.getAttributeValue(null, "id");
           name = reader.getAttributeValue(null, "name");
           text.setLength(0);
         }
         break;

         case XMLStreamConstants.CHARACTERS:
         text.append(reader.getText());
         break;

         case XMLStreamConstants.END_ELEMENT:
         if ("Language".equals(reader.getName().getLocalPart())) {
           System.out.println("id = " + id);
           System.out.println("name = " + name);
           System.out.println("text = " + text.toString());
           System.out.println();
          }
         break;
       }
     }
   } finally {
     if (reader != null) {
     reader.close();
     }
   }
 }
}
■実行結果
mbp:desktop potepan$ java Main
id = 001
name = Java
text = Javaは標準的なプログラミング言語です

id = 002
name = C言語
text = C言語はプログラミング言語の中でも非常に知名度の高いプログラミング言語です

id = 003
name = PHP
text = PHPは動的にWebページを生成できるプログラミング言語です

id = 004
name = Python
text = Pythonはインタープリタ型の高水準汎用プログラミング言語です

id = 005
name = Ruby
text = Rubyは日本で開発されたプログラミング言語です

XPath(XML Path Language)

XPathは、XMLの検索方法の1つでデータベースへのSQLに似ているものです。

他のAPIとは異なり、XPath構文で検索条件を記述してXMLに問い合わせると、条件を満たす要素・テキストを簡単に取得できます。

必要な情報をダイレクトかつ短いプログラム行数で取得できるのが特徴です。

■記述例
import java.io.FileInputStream;
import java.nio.file.Paths;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class XPathSample {
 public static void main(String[] args) throws Exception {
   FileInputStream stream = new FileInputStream(Paths.get("languageList.xml").toFile());
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   DocumentBuilder builder = factory.newDocumentBuilder();
   Document document = builder.parse(stream);

   XPath xpath = XPathFactory.newInstance().newXPath();
   XPathExpression expr = xpath.compile("/ProgramingList/Language");
   NodeList nodeList = (NodeList) expr.evaluate(document, XPathConstants.NODESET);

   for (int i = 0; i < nodeList.getLength(); i++) {
     Element element = (Element) nodeList.item(i);
     System.out.println("id = " + element.getAttribute("id"));
     System.out.println("name = " + element.getAttribute("name"));
     System.out.println("text = " + element.getTextContent());
     System.out.println();
   }
 }
}
■実行結果
mbp:desktop potepan$ java Main
id = 001
name = Java
text = Javaは標準的なプログラミング言語です

id = 002
name = C言語
text = C言語はプログラミング言語の中でも非常に知名度の高いプログラミング言語です

id = 003
name = PHP
text = PHPは動的にWebページを生成できるプログラミング言語です

id = 004
name = Python
text = Pythonはインタープリタ型の高水準汎用プログラミング言語です

id = 005
name = Ruby
text = Rubyは日本で開発されたプログラミング言語です

javax.xml.parsersパッケージについて

Java XML のparseメソッドは、指定した内容をXML文書として構文解析し、Documentオブジェクトを返すメソッドです。

javax.xml.parsersパッケージは、下記の4つのクラスをサポートしています。

javax.xml.parsersパッケージの4つのクラス
  • DocumentBuilder:XMLドキュメントからDOM Documentインスタンスを取得するAPIを定義
  • DocumentBuilderFactory:アプリケーションでXMLドキュメントからDOMオブジェクト・ツリーを生成するパーサーを取得できるファクトリAPIを定義
  • SAXParser:XMLReader実装クラスをラップするAPIを定義します。
  • SAXParserFactory:アプリケーションがSAXベースのパーサーを構成および取得してXMLドキュメントを構文解析できるようにするファクトリAPIを定義します。

サンプルプログラムにも使用しているクラスですね。

参考:パッケージ javax.xml.parsers

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。