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を読み込む方法とサンプル
XMLはJavaでも読み込むことができます。
読み込むためには、専用のAPI(Application Programming Interface)を使うことが必要です。
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は、要素がノードで表現され、ノードの関係がノードツリーで表現されたものです。
ノードは節や集合点といった意味の言葉ですね。
ツリー構造は、パソコン内のフォルダやファイルにも使われている表現方法で、これを用いた要素の検索と操作が得意とされています。
■記述例 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つのクラスをサポートしています。
- DocumentBuilder:XMLドキュメントからDOM Documentインスタンスを取得するAPIを定義
- DocumentBuilderFactory:アプリケーションでXMLドキュメントからDOMオブジェクト・ツリーを生成するパーサーを取得できるファクトリAPIを定義
- SAXParser:XMLReader実装クラスをラップするAPIを定義します。
- SAXParserFactory:アプリケーションがSAXベースのパーサーを構成および取得してXMLドキュメントを構文解析できるようにするファクトリAPIを定義します。
サンプルプログラムにも使用しているクラスですね。