コードを使用してXMLファイルを読み書きする方法

コードを使用してXMLファイルを読み書きする方法

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





XMLファイル データの保存を含むさまざまな目的で使用されます。 JSONが普及する前は、構造化データを表現、保存、および転送するためにXMLが好まれていました。 XMLの人気は近年衰退していますが、時々遭遇する可能性があるため、コードからXMLを操作する方法を学ぶことが重要です。





Java Standard Edition(SE)には、 XML処理用のJavaAPI(JAXP) 、これはXML処理のほとんどの側面をカバーする包括的な用語です。これらには以下が含まれます:





  • 判定: ドキュメントオブジェクトモデルには、要素、ノード、属性などのXMLアーティファクトを操作するためのクラスが含まれています。DOMAPIは、処理のために完全なXMLドキュメントをメモリにロードするため、大きなXMLファイルの操作にはあまり適していません。
  • サックス: Simple API for XMLは、XMLを読み取るためのイベント駆動型アルゴリズムです。ここで、XMLは、XMLの読み取り時に検出されたイベントを発生させることによって処理されます。このメソッドを使用するためのメモリ要件は低いですが、APIの操作はDOMの操作よりも複雑です。
  • StAX: Streaming API for XMLは、XML APIに最近追加されたものであり、XMLの高性能なストリームフィルタリング、処理、および変更を提供します。 XMLドキュメント全体をメモリにロードすることを回避しますが、イベント駆動型アーキテクチャではなくプルタイプのアーキテクチャを提供するため、アプリケーションはSAXAPIを使用するよりもコーディングと理解が容易です。

この記事では、 DOM API JavaからXMLファイルを読み書きする方法を示します。他の2つのAPIについては、今後の記事で取り上げます。

サンプルXMLファイル

この記事の目的のために、次のサンプルXMLを使用して概念を示します。 ここ






Gambardella, Matthew
XML Developer's Guide
Computer
44.95
2000-10-01
An in-depth look at creating applications
with XML.


Ralls, Kim
...

XMLファイルの読み取り

DOMAPIを使用してXMLファイルを読み取るために必要な基本的な手順を見てみましょう。

最初のステップは、のインスタンスを取得することです DocumentBuilder 。ビルダーは、XMLドキュメントを解析するために使用されます。基本的な使用法については、次のようにします。





YouTubeで誰があなたを購読しているかを確認する
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

これで、XMLルート要素から始めてドキュメント全体をメモリにロードできます。私たちの例では、それは カタログ エレメント。

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

そして、それだけです、皆さん! XMLを読み取るためのDOMAPIは本当にシンプルです。これで、ルート要素から始まるXMLドキュメント全体にアクセスできます。 カタログ 。それを操作する方法を見てみましょう。





DOMAPIの使用

これでXMLルートができました エレメント 、DOM APIを使用して、興味深い情報の塊を抽出できます。

すべてを取得します ルート要素の子とそれらをループします。ご了承ください getChildNodes() 戻り値 全て テキストやコメントなどを含む子。私たちの目的では、子要素だけが必要なので、他の要素はスキップします。

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
Element book = (Element)child;
// work with the book Element here
}

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

static private Node findFirstNamedElement(Node parent,String tagName)
{
NodeList children = parent.getChildNodes();
for (int i = 0, in = children.getLength() ; i Node child = children.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
if ( child.getNodeName().equals(tagName) )
return child;
}
return null;
}

DOM APIは、要素内のテキストコンテンツをタイプの個別のノードとして扱うことに注意してください TEXT_NODE 。さらに、テキストコンテンツは、複数の隣接するテキストノードに分割される場合があります。したがって、要素内のテキストコンテンツをフェッチするには、次の特別な処理が必要です。

static private String getCharacterData(Node parent)
{
StringBuilder text = new StringBuilder();
if ( parent == null )
return text.toString();
NodeList children = parent.getChildNodes();
for (int k = 0, kn = children.getLength() ; k Node child = children.item(k);
if ( child.getNodeType() != Node.TEXT_NODE )
break;
text.append(child.getNodeValue());
}
return text.toString();
}

これらの便利な関数を用意して、サンプルXMLからいくつかの情報をリストするためのコードを見てみましょう。書籍カタログなど、各書籍の詳細情報を掲載したいと思います。

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
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
' +
' author: %s
' +
' title: %s
' +
' genre: %s
' +
' price: %s
' +
' pubdate: %s
' +
' descr: %s
',
ii, id, author, title, genre, price, pubdate, descr);
}

XML出力の記述

Javaは XMLトランスフォームAPI XMLデータを変換します。このAPIは アイデンティティ変換 出力を生成します。

例として、新しいものを追加しましょう 上記のサンプルカタログの要素。本の詳細(など 著者題名 など)は、おそらくプロパティファイルまたはデータベースから外部から取得できます。次のプロパティファイルを使用してデータをロードします。

id=bk113
author=Jane Austen
title=Pride and Prejudice
genre=Romance
price=6.99
publish_date=2010-04-01
description='It is a truth universally acknowledged, that a single man in possession of a good fortune must be in want of a wife.' So begins Pride and Prejudice, Jane Austen's witty comedy of manners-one of the most popular novels of all time-that features splendidly civilized sparring between the proud Mr. Darcy and the prejudiced Elizabeth Bennet as they play out their spirited courtship in a series of eighteenth-century drawing-room intrigues.

最初のステップは、上記の方法を使用して既存のXMLファイルを解析することです。コードも以下に示されています。

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

を使用してプロパティファイルからデータをロードします プロパティ javaで提供されるクラス。コードは非常に単純で、以下に示されています。

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');

空を作成しましょう エレメント。

プラスチックスクリーンプロテクターを取り外す方法
Element book = document.createElement('book');
book.setAttribute('id', id);

子要素をに追加する 些細なことです。便宜上、必要な要素名を リスト ループに値を追加します。

List 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));
el.appendChild(text);
book.appendChild(el);
}
catalog.appendChild(book);

そして、それはそれが行われる方法です。 NS カタログ 要素に新しい 要素が追加されました。現在残っているのは、更新されたXMLを書き出すことだけです。

XMLを作成するには、次のインスタンスが必要です。 変成器 以下のように作成されます。を使用して出力XMLのインデントを要求することに注意してください setOutputProperty() 方法。

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

XML出力を生成する最後のステップは、変換を適用することです。結果は出力ストリームに表示されます。 System.out

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

出力をファイルに直接書き込むには、以下を使用します。

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

これで、DOMAPIを使用したXMLファイルの読み取りと書き込みに関するこの記事は終わりです。

アプリケーションでDOMAPIを使用しましたか?どのように機能しましたか?以下のコメントでお知らせください。

共有 共有 つぶやき Eメール キヤノン対ニコン:どちらのカメラブランドが優れていますか?

キヤノンとニコンは、カメラ業界で最も有名な2社です。しかし、どのブランドがより良いカメラとレンズのラインナップを提供していますか?

次を読む
関連トピック
  • プログラミング
  • Java
著者について ジェイ・スリダール(17の記事が公開されました) JaySridharのその他の作品

ニュースレターを購読する

ニュースレターに参加して、技術的なヒント、レビュー、無料の電子書籍、限定セールを入手してください。

購読するにはここをクリックしてください