XMLって何?
XML(Extensible Markup Language)とは、任意の用途向けにデータ構造をシンプルに表現したマークアップ言語のことです。
マークアップ言語とは、タグと値のセットで構成され、文章を構造化する言語をいいます。
例えば、Webサイト作成で使われる HTML言語 が有名どころのマークアップ言語ですね。
HTMLがWebサイトの情報を記述するる言語に対し、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の読み込みサンプル
本章では、JavaでXMLを読み込む方法とそのサンプルを確認しましょう。
JavaでXMLを読み込む際に使う主なAPIには、下記の4種類があります。
- DOM(Document Object Model)
- SAX(Simple API for XML Processing)
- StAX(Streaming API for XML)
- XPath(XML Path Language)
それぞれについて、簡単に説明とサンプルを紹介します。
DOM(Document Object Model)
DOMは、要素がノードで表現され、ノードの関係がノードツリーで表現されたものです。
ノードは節や集合点といった意味の言葉ですね。
ツリー構造は、パソコン内のフォルダやファイルにも使われている表現方法で、これを用いた要素の検索と操作が得意とされています。
DOMでXMLファイルを読み込むサンプルは、下記の通りです。
■記述例 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のツリー構造を意識したプログラミングは難しいとされています。
SAXで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よりも制限が緩く、決まったクラスやインターフェイスを継承・実装する必要がないという特徴があります。
StAXでXMLファイルを読み込むサンプルは、下記の通りです。
■記述例 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に問い合わせると、条件を満たす要素・テキストを簡単に取得できます。
必要な情報をダイレクトかつ短いプログラム行数で取得できるのが特徴です。
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は日本で開発されたプログラミング言語です
JavaでXMLを出力する方法
ここまで、JavaでXMLを読み込む方法を解説しました。
Javaでは、XMLファイルを出力することも可能です。
もし、XMLファイルの出力方法を知りたい場合は、下記の記事で詳しく解説していますので、参考にしてみてください。
【関連記事】