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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア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
総合スコア686
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。