\r\n\r\n

xmlファイルの読み書きをコードで行う方法

最近、xmlの人気が低下していますが、時折、xmlに出くわすことがあるので、コードからxmlファイルを読み書きする方法を学ぶことが重要です。

javaからXMLファイルを読み書きする方法を学びたいですか?

xml-read-write

XMLファイルは、データの保存をはじめ、さまざまな用途で利用されています。JSONが普及する以前は、構造化されたデータを表現、保存、転送するための形式としてXMLが選ばれていました。近年、XMLの普及率は低下していますが、たまに遭遇することもあるので、コードから使い方を学ぶことが重要です。

javastandardedition (SE) には、XML処理のほとんどの側面を網羅するjavaapi for XML Processing (JAXP) が含まれています。これらは、以下の通りです。

  • DOM:Document オブジェクトモデルは、XML アーチファクト(要素、ノード、属性など)を処理するためのクラスで構成されています。domapi は XML 文書全体をメモリにロードして処理するので、大きな XML ファイルの処理にはあまり適していません。
  • SAX:Simple-API-for-XML は、XML を読み込むためのイベント駆動型アルゴリズムです。ここでは、XMLを読み込む際に見つかったイベントをトリガーとしてXMLを処理します。この方法を使用する際の必要メモリは少ないですが、APIを使用することは、DOMを使用するよりも複雑です。
  • StAX:streamingapiはxmlapiの最新版で、高性能なXMLストリームのフィルタリング、処理、修正を提供します。XML文書全体をメモリに読み込むことは避けられますが、イベントドリブンではなくプル型のアーキテクチャを提供するため、saxapiを使用するよりもアプリケーションのコーディングと理解が容易になります。

この記事では、domapiを使用して、JavaからXMLファイルを読み書きする方法を説明します。他の2つのAPIについては、後日取り上げる予定です。

xmlファイルの例

この記事では、以下のXMLの例を使って、これらの概念を実証します。

<?xml version="1.0"?>
<カタログ>
<book id="bk101">の場合。
<著者>Gambardella, Matthew</author
<title>XMLデベロッパーズガイド</title>。
<ジャンル> コンピュータ</ジャンル
<価格>44.95円</価格>。
<publish_date>2000-10-01</publish_date>
<description>アプリケーションの作成について詳しく見ていきましょう****。
をXMLで表示します。</description>

<book id="bk102">の場合。
<著者>Ralls, Kim</ 著者
...

xmlファイルの読み込み

domapiを使用してXMLファイルを読み込むために必要な基本的なステップを見てみましょう。

まず、DocumentBuilderのインスタンスを取得する。ジェネレータは、XML文書のパースに使用される。基本的な使い方は、以下の通りである。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false)を実行します。
factory.setValidating(false)を実行します。
DocumentBuilder builder = factory.newDocumentBuilder();

これで、XMLのルート要素(この例ではcatalog要素)から始まる文書全体をメモリに読み込むことができるようになりました。

File file = ...; // XML file to read
Document document = builder.parse(file)。
Element catalog = document.getDocumentElement();

以上、皆さん、お疲れ様でした。XML domapiの読み方はとても簡単です。これで、ルート要素のカタログから始まるXML文書全体にアクセスできるようになりました。では、その使い方をみていきましょう。

domapiの使用

XMLのルート要素を取得できたので、domapiを使って興味深い情報を抽出することができます。

ルート要素のすべてのブック子要素を取得し、それらをループする。getChildNodes() は、テキストやコメントなど、すべての子要素を返すことに注意してください。今回は、子要素だけが必要なので、他の要素は省略します。

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i < n ; i++) {.
Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
続けて
Element book = (Element)child;
// 書籍「エレメント」との連携はこちら
}

親要素がある場合、特定の子要素をどのように見つけるのですか?次の静的メソッドは、最初にマッチした要素(見つかった場合)、またはnullを返します。見てわかるように、この手順では子ノードのリストを取得し、それらをループして指定された名前の要素ノードを選択します。

static private Node findFirstNamedElement(Node parent,String tagName)
{
NodeList children = parent.getChildNodes()です。
for (int i = 0, in = children.getLength() ; i < in ; i++) {.
Node child = children.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
続けて
if ( child.getNodeName().equals(tagName) )
を返す子。
}
は null を返します。
}

domapiは、要素内のテキストコンテンツをtextu nodeというタイプの別のノードとして扱うことに注意してください。また、テキストコンテンツは、隣接する複数のテキストノードに分割されている場合がある。そのため、要素内のテキスト内容を取得するためには、以下のような特殊な処理が必要となる。

static private String getCharacterData(Node parent)
{
StringBuilder text = new StringBuilder();
if ( parent == null )
text.toString()を返します。
NodeList children = parent.getChildNodes()です。
for (int k = 0, kn = children.getLength() ; k < kn ; k++) {.
Node child = children.item(k);
if ( child.getNodeType() != Node.TEXT_NODE )
が壊れる。
text.append(child.getNodeValue())。
}
text.toString()を返します。
}

これらの便利な関数を使って、サンプルのXMLからいくつかの情報をリストアップするコードを見てみましょう。書籍カタログに掲載されているような、各書籍の詳細情報を表示したい。

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i < n ; i++) {.
Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
続けて
Element book = (Element)child;
ii++です。
String id = book.getAttribute("id")。
String author = getCharacterData(findFirstNamedElement(child, "author"));
String title = getCharacterData(findFirstNamedElement(child, "title"));
String genre = getCharacterData(findFirstNamedElement(child, "genre"))とする。
String price = getCharacterData(findFirstNamedElement(child, "price"));
String pubdate = getCharacterData(findFirstNamedElement(child, "pubdate"));
String descr = getCharacterData(findFirstNamedElement(child, "description"));
System.out.printf("%3d. book id = %s")
" +
" 作者: %s
" +
" タイトル: %s
" +
" ジャンル: %s
" +
" 価格: %s
" +
" 公開日: %s
" +
" descr: %s
",
ii, id, author, title, genre, price, pubdate, descr);
}

xml出力への書き込み

JavaはXMLデータを変換するためのXML変換APIを提供している。このAPIとID変換を使って出力を生成している。

例として、上のカタログの例に新しい本の要素を追加してみましょう。本の詳細(著者、タイトルなど)は、おそらくプロパティファイルやデータベースから外部で取得することができます。データの読み込みには、以下のプロパティファイルを使用します。

id=bk113
著者=Jane Austen
title=「高慢と偏見」(Pride and Prejudice)
ジャンル=ロマンス
価格=6.99
publish_date=2010-04-01
description="It is a truth universular acknowledged, the single man in possession of good fortune must be in the want of a wife." (幸運を手にした独身男は、妻に恵まれないというのは、誰もが認める真実である)高慢なダーシーと偏見に満ちたエリザベス・ベネットが、18世紀の居間で繰り広げられる陰謀に巻き込まれながら、華麗で礼儀正しい口論を繰り広げます。

まず、上記の方法で既存のXMLファイルをパースします。そのコードを以下に示します。

File file = ...; // XML file to read
Document document = builder.parse(file)。
Element catalog = document.getDocumentElement();

javaが提供するpropertiesクラスを使って、プロパティファイルからデータを読み込んでいます。コードは非常にシンプルで、以下のようになります。

String propsFile = ...;
Properties props = new Properties();
try (FileReader in = new FileReader(propsFile)) {.
props.load(in);
}

プロパティを読み込んだ後、追加する値をプロパティファイルから取得します。

String id = props.getProperty("id");
String author = props.getProperty("author")。
String title = props.getProperty("title");
String genre = props.getProperty("genre")。
String price = props.getProperty("price")。
String publish_date = props.getProperty("publish_date")。
String descr = props.getProperty("description").

では、空のbook要素を作ってみましょう。

Element book = document.createElement("book");
book.setAttribute("id", "id")。

子要素をブックに追加するのは簡単です。便宜上、必要な要素の名前をリストに集め、ループ内で値を追加していきます。

List<String> elnames =Arrays.asList("author", "title", "genre", "price",
"publish_date", "description")。
for (String elname : elnames) {.
Element el = document.createElement(elname);
Text text = document.createTextNode(props.getProperty(elname)).Text text = document.createTextNode(props.getProperty(elname));
el.appendChild(text)を実行します。
book.appendChild(el)を実行します。
}
catalog.appendChild(book)。

catalog 要素に newbook 要素が追加されました。あとは、更新された XML を書くだけです。

XMLを書き込むためには、以下のようにTransformerのインスタンスを作成する必要があります。setOutputProperty()メソッドを使用して、出力XMLのインデントを要求していることに注意してください。

TransformerFactory tfact = TransformerFactory.newInstance();
Transformer tform = tfact.newTransformer();
tform.setOutputProperty(OutputKeys.INDENT, "yes");
tform.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");

XML出力の生成の最終ステップは,変換を適用することである.その結果は,出力ストリームに表示され,システムは.NET Frameworkを出力する.

tform.transform(new DOMSource(document), new StreamResult(System.out));

出力を直接ファイルに書き出すには、次のコマンドを使用します。

tform.transform(new DOMSource(document), new StreamResult(new File("output.xml")));

以上で、domapiを使ったXMLファイルの読み書きの記事を終わります。

あなたのアプリケーションでdomapiを使用したことがありますか、そしてそれはどのように実行されましたか?

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ