Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

XMLについて

前回XMLについて質問させていただきました。ありがとうございます。
今回のソースは、要素名を使って絞り込むという形になっています。
自動的絞り込むのではなく、ちゃんと自分でキーボードで文字を打ち、XMLファイルから打った文字がヒットしてそのデータ1データ(title,id,kakaku)が全てでてくるようにしたいのですがどうやればよろしいんでしょうか?
本を読んだのですがわからなくて…すいませんが教えてください。宜しくお願いします。


import java.io.*;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.*;


public class key {
  public static void main(String[] args) {
      String  fileNameStr   =  "1111.xml";

      System.out.println("タイトルを記入してください:");
      BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
    
      try {
    String str = in.readLine();
    
        DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
          
          // ドキュメントビルダーを生成
          DocumentBuilder xml = dbfactory.newDocumentBuilder();

          Document doc = xml.parse(new FileInputStream(fileNameStr));
        
          Document doc2 = xml.newDocument();
          
          //Element root = doc2.createElement("title");
         // doc2.appendChild(root);
          
          NodeList lst= doc.getElementsByTagName("title");
    
          for(int i=0;i<lst.getLength();i++){
              Node n =lst.item(i);
          
              for(Node ch =n.getFirstChild();
              ch !=null;
              ch =ch.getNextSibling()){
                  if(ch.getNodeValue().indexOf("さ") != -1){
                      Element elm = doc.createElement("title");
                      Text txt=doc2.createTextNode(ch.getNodeValue());
                      System.out.println(elm);
                      System.out.println(txt);
                      
                  }
              }
          }
    
    } catch (Exception e) {
      e.printStackTrace();
    } }}

8

回答

4378

閲覧

8件の回答

評価

0

先日の問題はどうなったんでしょうか。
分からないからやめにして、次と言うのはどうかと思いますが。

評価

0

あちらにレスをしたけれど、流れていて誰も気づかなかったようですね。

>全てでてくる
タイトルでヒットしたら、そのparentの下のidやらkakakuを出力すれば良いのではないでしょうか。

DOMでXMLを操作する場合、頭の中で(できなかったら紙に書いて)、
あるコードがツリーのどの部分を見ているのか、把握するように努めましょう。
XMLのような階層構造を考える場合、それが常に重要になります。
逆に言えば、それができなければXMLの操作はできません。

すでにできている階層構造の走査は(階層構造が単純であれば)、
・ルートを取る
・特定の要素の集合を取る
・特定の要素の子要素の集合を取る
・特定の要素の値を取る
程度のことが分かれば、さほど難しくはないはずです。
場合によっては、
・特定の要素の兄弟要素を取る
・特定の要素の親要素を取る
というようなことも必要かも知れませんが、この場合はなくてもできそうに思えます。

評価

0

質問の返事ありがとうございます。

ちょっといろいろやってみたらコマンドプロンプトではちゃんと出力されたのですが…GUIでやるとエラーがでました。ヒット検索はできるようになりました。

for(int i=0;i<lst.getLength();i++){
              Node n =lst.item(i);
          
              for(Node ch =n.getFirstChild();
              ch !=null;
              ch =ch.getNextSibling()){
                  if(ch.getNodeValue().indexOf("さ") != -1){
                      Text txt=doc2.createTextNode(ch.getNodeValue());
System.out.println(txt);
のSystem.out.println()の所を、
ta.append(txt)にしたらできないというエラーが出力されました。taは自分で宣言したTextAreaの事です。
無事出力させたいのですが、どうしたらいいのでしょうか?

今質問に書かれていたことを考えてやってみたいと思います。

もしわかったらまた教えてください。すいませんがよろしくお願いします。

評価

0

>できないというエラーが出力されました。
エラーメッセージは正確に記述してください。
メッセージがないと、他人は大抵の場合コードをコピーして実験をしなければなりません。
質問をするのなら、相手にできるだけ負担をかけないように、すべきではないでしょうか。

メソッドの引数には、それぞれ決まった型があります。
これはDOMなんかの技術以前に、Javaの基本的な部分です。

http://www.javaroad.jp/java_class5.htm
勉強してください。

System.out.println()で値が表示されるのは、渡されたオブジェクトのtoString()メソッドを呼んで、
必ずStringクラスとなるように、できているからです。
ただし、toString()メソッドは、値を得るメソッドではありませんので、これを使うのは間違いです。

評価

0

ありがとうございます。
問題は解決しました。毎回すいません。

今エラーというか
String str = in.readLine();
があるんですがその手前までは、出力でているんですが、
このString str = in.readLine();が来るとGUIの画面がフリーズします。強制終了するしか駄目になります。
他の書き方があるのか?いろいろ調べています。
今いろいろ調べていますが、もし知っている人いたらまた教えてください。

いろんな返答どうもありがとうございます。

評価

0

アプレットには、通常の意味での標準入力というものはありません。

評価

0

返信ありがとうございます!
現状では、タイトルでキーワード検索は、できるようになりました。
次にタイトルを入力する事で、その(入力した)商品の価格に近い順に商品を出力させたいのですがこれは、
 NodeList lst= doc.getElementsByTagName("title");
 NodeList lst1= doc.getElementsByTagName("kakaku");

という二つのタグを使ってやっていけばいいのでしょうか?
意味が違っていたらすいません。


 NodeList lst= doc.getElementsByTagName("title"+"kakaku");
と言うように1つのタグで全部とることができるのでしょうか?

もしやり方わかる人いたら教えてください。

すいませんがよろしくお願いします。

評価

0

なんだか、前のスレッドでのやりとりが全く意味を成していない気がするんですが…?

>いいのでしょうか?
>できるのでしょうか?
聞く前にやってみることです。
それでは答えを聞いているのと一緒で、自分で作る意味がありません。

>1つのタグ
それは1つの「メソッド」です。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。