質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

2回答

2624閲覧

構造がわからない

sk2938

総合スコア21

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/02/03 12:16

import javax.xml.parsers.;
import org.w3c.dom.
;
import java.io.*;
public class Main {
public static void main(String[]args)throws Exception{
InputStream is=new FileInputStream("~~~~.xml");
Document doc=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);

最後の文が理解できません。DocumentBuilderFactory.newInstance()でDocumentBuilderFactoryをインスタンスを取得した後、何をしているんですか。
教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

説明が多くなりすぎてうまくまとめられませんでした、話が長くなってしまいますが、
興味があればおつきあいください。

最後の文が理解できません。DocumentBuilderFactory.newInstance()でDocumentBuilderFactoryをインスタンスを取得した後、何をしているんですか。

ご質問のコードは、以下のような定型的な処理を、分かりきった部分をまとめて簡略した記述です
(「~~~~.xml」というファイル名は、ちょっと奇抜すぎたので「a.xml」に代えさせて頂きました。)

Java

1import javax.xml.parsers.*; 2import org.w3c.dom.*; 3import java.io.*; 4 5public class Main { 6 public static void main(String[] args) throws Exception { 7 // "a.xml" を入力ストリーム is として開く 8 InputStream is = new FileInputStream("a.xml"); 9 10 // DocumentBuilder クラスのインスタンスを生成する DocumentBuilderFactory のインスタンスを生成する 11 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 12 13 // DocumentBuilderFactory のインスタンスを使って、DocumentBuilderのインスタンスを生成する 14 DocumentBuilder builder = factory.newDocumentBuilder(); 15 16 // DocumentBuilde のインスタンスを使って入力ストリーム is を読み込んで解析し、 17 // Documentのインスタンス(をルートとした)HTMLの要素構造の解析結果インスタンスの集合体) 18 // を得る 19 Document doc = builder.parse(is); 20 } 21}

「構造がわからない」というタイトルでしたので、この処理に関する構造図(クラス図)を以下に示します。

クラス図

これらのクラスを使って以下のように必要なインスタンスの取得を行っているのが
このプログラムでしていることの概略です

シーケンス図

builder.parse(is) の処理

上の説明では、builder.parse(is) と doc インスタンスの説明を省いているので、
以下にこの点についてもう少し詳しく説明します。
この処理がご質問のコードの本来の目的で、それ以前の処理は準備をしているに過ぎません。

parse という言葉はコンピュータの世界では「構文解析」という意味で使われます。
操作対象がなんらかの人工言語であった場合、ほぼ間違いなくそういう意味です。

ですから、

builder.parse(is)

は is で指定された XML を構文解析して、 doc インスタンスに変換しています。
具体的な例を示して説明します。

XML の内容が以下のようなものであったとします。

XML

1<?xml version="1.0" encoding="Shift-Jis" ?> 2<root> 3 <child01>child1 text</child01> 4 <child02>child2 text</child02> 5</root>

これに対して以下のようなプログラムを実行したとします。
(上のプログラムに、 doc の内容を表示する処理を追加したものです)

Java

1import java.io.FileInputStream; 2import java.io.InputStream; 3 4import javax.xml.parsers.DocumentBuilder; 5import javax.xml.parsers.DocumentBuilderFactory; 6 7import org.w3c.dom.Document; 8import org.w3c.dom.Node; 9import org.w3c.dom.NodeList; 10 11public class Main { 12 public static void main(String[] args) throws Exception { 13 // "a.xml" を入力ストリーム is として開く 14 InputStream is = new FileInputStream("a.xml"); 15 16 // DocumentBuilder クラスのインスタンスを生成する DocumentBuilderFactory のインスタンスを生成する 17 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 18 19 // DocumentBuilderFactory のインスタンスを使って、DocumentBuilderのインスタンスを生成する 20 DocumentBuilder builder = factory.newDocumentBuilder(); 21 22 // DocumentBuilde のインスタンスを使って入力ストリーム is を読み込んで解析し、 23 // Documentのインスタンス(をルートとした)HTMLの要素構造の解析結果インスタンスの集合体) 24 // を得る 25 Document doc = builder.parse(is); 26 27 28 // doc の中身を見る 29 printNodeTypes(doc, "0" ); 30 } 31 32 private static void printNodeTypes(Node doc, String number_str ) { 33 34 NodeList list = doc.getChildNodes(); 35 for ( int i = 0; i < list.getLength(); ++i ) { 36 Node node = list.item(i); 37 System.out.printf("[%s-%d] - [%s]:[%s]\n", number_str, i , node.getNodeName(), node.getNodeValue() ); 38 printNodeTypes(node, number_str + "-" + Integer.toString(i) ); 39 } 40 } 41}

この出力結果は以下のようになります。

[0-0] - [root]:[null] [0-0-0] - [#text]:[ ] [0-0-1] - [child01]:[null] [0-0-1-0] - [#text]:[child1 text] [0-0-2] - [#text]:[ ] [0-0-3] - [child02]:[null] [0-0-3-0] - [#text]:[child2 text] [0-0-4] - [#text]:[ ]

この出力から paser が返した、doc インスタンスの内容を推測しておおまかなオブジェクト図を描くと以下のようになります。

オブジェクト図

このように、XML を読み込んで解析し、Java のプログラムで扱いやすい Node インターフェースを使ったツリー構造に変換している。

というのが、

最後の文が理解できません。DocumentBuilderFactory.newInstance()でDocumentBuilderFactoryをインスタンスを取得した後、何をしているんですか。

の最終的な答えです。

投稿2016/02/12 11:46

kozuchi

総合スコア1193

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Document doc=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);

DocumentBuilderFactory.newInstance()でDocumentBuilderFactoryをインスタンスを取得した後、そのDocumentBuilderFactoryから新しいドキュメントビルダーを生成し、その生成したドキュメントビルダーでisのxmlファイルを構文解析してDOMドキュメントを作成し、Document型の変数docに格納していますね。

ざっくりいえば、"~~~~.xml"をDOM Documentに変換して変数docに入れてる文かと思います。

投稿2016/02/03 12:23

thom.jp

総合スコア686

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sk2938

2016/02/12 08:59

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問