JavaによるXMLの読み込みの方法

このQ&Aのポイント
  • JavaでXMLを読み込む方法についての質問です。現在、JavaでXMLを読み込んで要素名を取得することはできましたが、属性名と属性の値を読み込んで表示する方法がうまくいきません。どこに何を追加すれば良いでしょうか。
  • JavaでXMLの要素名を取得する方法は分かるのですが、属性名と属性の値を読み込んで表示する方法が分からなくて困っています。どのようにすれば実現できるでしょうか。
  • JavaでXMLファイルを読み込んで要素名を取得する方法は理解していますが、属性名と属性の値を読み込む方法がわかりません。どのようにすれば実装できるのか、教えていただけますか。
回答を見る
  • ベストアンサー

JavaによるXMLの読み込みについて

現在、JavaでXMLを読みたく色々なサイト様を参考にさせて頂き プログラムを作成しております。 その結果、下記のようなプログラムで要素名を取得することは出来たのですが、 「属性名」と「属性の値」を読み込み表示することが中々上手くいきません。 どこに何を追加したらよいでしょうか。宜しければ教えて下さい。 -- sample.java -- sample.xml -------------------------------------- import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.*; import java.io.*; public class sample { public static void main(String[] argv) { sample a = new sample(); a.runner(); } final static String file = "sample.xml"; public void runner() { DocumentBuilderFactory factory; DocumentBuilder builder; Node root; try { factory = DocumentBuilderFactory.newInstance(); builder = factory.newDocumentBuilder(); factory.setIgnoringElementContentWhitespace(true); factory.setIgnoringComments(true); factory.setValidating(true); root = builder.parse(file); showNodes(root, " "); } catch (ParserConfigurationException e0) { System.out.println(e0.getMessage()); } catch (SAXException e1){ System.out.println(e1.getMessage()); } catch (IOException e2) { System.out.println(e2.getMessage()); } } public void showNodes(Node node, String space) { NodeList nodes = node.getChildNodes(); for (int i=0; i<nodes.getLength(); i++) { Node node2 = nodes.item(i); if(!node2.getNodeName().equals("#text")){ System.out.println(space + "<" + node2.getNodeName() + ">"); showNodes(node2, space + " "); } } } }

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

======Javaのソースコード============= import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.*; import java.io.*; public class sample { public static void main(String[] argv){ sample a = new sample(); a.runner(); } final static String file = "sample.xml"; public void runner() { DocumentBuilderFactory factory; DocumentBuilder builder; Document doc; Node root; try { factory = DocumentBuilderFactory.newInstance(); builder = factory.newDocumentBuilder(); factory.setIgnoringElementContentWhitespace(true); factory.setIgnoringComments(true); factory.setValidating(true); factory.setNamespaceAware(true); doc = builder.parse(file) ; showNodes(doc.getDocumentElement(), " "); } catch (ParserConfigurationException e0) { System.out.println(e0.getMessage()); } catch (SAXException e1){ System.out.println(e1.getMessage()); } catch (IOException e2) { System.out.println(e2.getMessage()); } } public void showNodes(Node node, String space) { NodeList nodes = node.getChildNodes(); for (int i=0; i<nodes.getLength(); i++) { Node node1 = nodes.item(i); if (node1.getNodeType() == Node.TEXT_NODE){ continue; } switch(node1.getNodeType()){ /* 個人的にはこのほうが好き。*/ case Node.ELEMENT_NODE: /* 【キャストする!】*/ Element element = (Element)node1; /* 何故か俺の環境のJDK7では element.getLocalNameやattribute.getLocalNameがnullを返したので仕方なく。 開発版だからかな?DOM Level1扱いになっているのかな? 本当は名前空間接頭辞ではなく名前空間URIとローカル名を分けて表示したかったんだけど。 */ System.out.println("element:[" + element.getNodeName() + "]"); /* 今回は全属性を列挙したかったからこういう形を採ったけど、 特定の属性名の属性が欲しい場合は attributes.getNamedItem(String name) もっと単純に element.getAttributeNS(String namespaceURI, String localName) を使ってもいいだろう。 */ NamedNodeMap attributes = element.getAttributes(); for(int j = 0;j < attributes.getLength();j++){ /* 【ここでもキャストする!】*/ Attr attribute = (Attr)attributes.item(j); System.out.println("attribute:[" + attribute.getNodeName() + "]"); System.out.println(attribute.getNodeValue()); } break; default: break; } } } } ====================用いたXML(UTF-8,XML宣言書くの面倒だった)=========== <a> <a:b xxx="p" xmlns:a="hoge" /> <b yyy="q" /> <b zzz="r" /> </a> ======================出力結果================= element:[a:b] attribute:[xmlns:a] hoge attribute:[xxx] p element:[b] attribute:[yyy] q element:[b] attribute:[zzz] r ================ 名前空間宣言って属性ノード扱いなのか?

ruri3953
質問者

お礼

ありがとうございます。 これで無事欲しい情報を得られると思います。 Javaは大分初心者なのでコメント解説して頂いてとても助かりました。 他にも色々と良い勉強になりました。有難うございました<(_ _)>

関連するQ&A

  • XMLファイルの読込み方法についての質問

    こんにちは、mako-kwnshと申します。 あるXMLを読み込んで指定したノード内 のデータを取り込んだ後、 指定したノードをnode型のデータに 代入したいのですが、 やり方がいまいちわかりません。 DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = builder.parse("c:\\Scenario\\test1.xml"); Element xmlroot = doc.getDocumentElement(); //String first = xmlroot.getNodeName(); // EMSData d3aData = new EMSData(att); // System.out.println("ddd" + d3aData.getValue(D3aCommonInfoPath.SYSTEM_KIND)); // System.out.println("ddd" + xmlroot);

    • ベストアンサー
    • Java
  • JavaでのXMLデータ抽出について

    いつも、お世話になります。 以前、Perlでも似たような質問をさせていただきましたが、結局、Javaで作ることになりました。ところが、以下の現象が発生して困っております。 プログラムは、下記のXmlファイルを読み込ませ"★"の部分を抽出してくるというプログラムです。 読み込んだ結果として、次のようなものが欲しいとすると、 memoNumber = Class_A MemoNumber = 53 memoNumber = Class_B MemoNumber = 67 : 実際には、以下のようになってしまいます。 memoNumber = Class_A MemoNumber = 53 memoNumber = Class_A MemoNumber = 42 : つまり、"memoNumber"の最初の要素しか見ておらず、次の"MemoNumberList"以下のタグ内を探しに行ってしまうようです。 そこまでは分かったのですが対処法法が分かりません。 読み込ませたいXMLファイルは以下のとおりです(データ数が膨大になるので一部省略をしています) <MemoBlockList> <Class ID="namae1" >★ <Local>1</Local> <AmemoWritingLocationList> <AmemoWritingLocation Length="50" Side="1">★ <CreateID>345.9886776</CreateID> <IDList> <IDNo IDNo="1">★ <MemoNumberList> <MemoNumber memoNumber="Class_A">53</ClassName>★ <MemoNumber memoNumber="Class_B">67</ClassName>★ <MemoNumber memoNumber="Class_C">88</ClassName>★ <MemoNumber memoNumber="Class_D">00</ClassName>★ <MemoNumber memoNumber="Class_E">32</ClassName>★ </MemoNumberList> </IDNo> </IDList> <IDNo IDNo="2">★ <MemoNumberList> <MemoNumber memoNumber="Class_A">42</ClassName>★ <MemoNumber memoNumber="Class_B">90</ClassName>★ <MemoNumber memoNumber="Class_C">101</ClassName>★ <MemoNumber memoNumber="Class_D">978</ClassName>★ <MemoNumber memoNumber="Class_E">21</ClassName>★ </MemoNumberList> </IDNo> </IDList> <IDNo IDNo="3">★ <MemoNumberList> <MemoNumber memoNumber="Class_A">10</ClassName>★ <MemoNumber memoNumber="Class_B">1</ClassName>★ <MemoNumber memoNumber="Class_C">11</ClassName>★ <MemoNumber memoNumber="Class_D">99</ClassName>★ <MemoNumber memoNumber="Class_E">66</ClassName> </MemoNumberList> </IDNo> </IDList> </AmemoWritingLocation> <location>15</location> </AmemoWritingLocationList> </MemoBlock> </MemoBlockList> Javaのソースは以下のとおりです。 import javax.xml.parsers.*; import org.w3c.dom.*; import java.io.*; public class MemoBlecks { public static void main(String[] args) { try { DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbfactory.newDocumentBuilder(); Document doc = builder.parse(new File("MemoBlock.xml")); Element root = doc.getDocumentElement(); System.out.println("ルート要素のタグ名:" + root.getTagName()); System.out.println("***** 値リスト *****"); System.out.println("要素:memoNumberList"); System.out.println("値:MemoNumberList"); NodeList list = root.getElementsByTagName("MemoNumberList"); for (int i=0; i < list.getLength() ; i++) { Element element = (Element)list.item(i); String MemoNumber = element.getAttribute("memoNumber"); NodeList MemoNumberList = element.getElementsByTagName("MemoNumber"); Element MemoNumberElement = (Element)MemoNumberList.item(0); String MemoNumber = MemoNumberElement.getFirstChild().getNodeValue(); System.out.println("memoNumber="+memoNumber); System.out.println("MemoNumber="+MemoNumber); } } catch (Exception e) { e.printStackTrace(); System.out.println("このウィンドウ上で次の操作を実行してください..."); System.out.println("「右クリック→すべて選択→右クリック→テキストエディタを開き、evaluation.txtとして保存」"); } } } 開発環境は次のとおりです。 OS:WindowsXP HomeEdition SP2 Java:JDK1.6.0_04 Javaに関しては初心者レベルの知識しかありません。そのため、載せたものも少々おかしいですが、どなたかご教授のほどお願い致します。

    • ベストアンサー
    • Java
  • eclipse,mysql,javaエラー

    Class.forName("com.mysql.jdbc.Driver")が接続出来ません どなたかお教え頂けないでしょうか MySQLを再インストールしてもだめです 下記環境で動かしています。 eclipse-3.72 MySQL5.5.13,JDBC:4.0.0 mysql-connector-java5.1.17-bin.jar jdk.1.6.0_26 eclipseで 接続プロファイルを作成し、mysql-connector-java5.1.17-bin.jarを設定して 接続デスト pingが正常に完了しましたで問題がありません。 またjavaのビルド・パスにもmysql-connector-java5.1.17-bin.jarが有りますが javaを実行すると下記状態になります Class.forName("com.mysql.jdbc.Driver")が接続出来ません 下記が実行ソースプログラム import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.sql.*; public class test01 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ response.setContentType("text/html; charset=Shift_JIS"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>データベーステスト</title>"); out.println("</head>"); out.println("<body>"); out.println("<p>"); Connection conn = null; String url = "jdbc:mysql://localhost/testdb"; String user = "root"; String password = "test"; try { Class.forName("com.mysql.jdbc.Driver").newInstance(); out.println("ドライバのロードに成功しました<br>"); conn = DriverManager.getConnection(url, user, password); out.println("データベース接続に成功しました<br>"); }catch (ClassNotFoundException e){ out.println("ClassNotFoundException:" + e.getMessage()); }catch (SQLException e){ out.println("SQLException:" + e.getMessage()); }catch (Exception e){ out.println("Exception:" + e.getMessage()); }finally{ try{ if (conn != null){ conn.close(); out.println("データベース切断に成功しました"); }else{ out.println("コネクションがありません"); } }catch (SQLException e){ out.println("SQLException:" + e.getMessage()); } } out.println("</p>"); out.println("</body>"); out.println("</html>"); } }

    • ベストアンサー
    • Java
  • JavaでのXMLパーサの使用について

    javaでパーサを使ってDOMツリーを作成したいのですが、パーサインスタンスが作成できずにエラーがでてしまいます。ちなみにコンパイルは通ります。 以下にソースとエラー内容を記述しますので、もしよろしかったらどなたか教えて下さい。 import java.io.*; import com.ibm.xml.parsers.*; import org.xml.sax.*; import org.w3c.dom.*; public static void main(String[] args){ try{      //XML文書作成 String xml = "<sample>Hello Java World</sample>"; //DOMパーサ作成 DOMParser parser = new DOMParser(); //入力ストリーム作成      StringReader sr = new StringReader(xml); InputSource is = new InputSource(sr); //パースする parser.parse(is); //ドキュメントを得る Document doc = parser.getDocument(); //トップレベル要素を得る Element el = doc.getDocumentElement(); System.out.println("Top Level Element: " + el.getTagName()); } catch(Exception e){ e.printStackTrace(); } } エラー内容: java.lang.NoClassDefFoundError: com.ibm.xml.parsers.DOMParser java.lang.Throwable(java.lang.String) java.lang.Error(java.lang.String) java.lang.LinkageError(java.lang.String) java.lang.NoClassDefFoundError(java.lang.String) void pkxml.dom.PsDomBean.makedom() void pkxml.dom.PsDomBean.makedom() void pkxmlsutabu.Sutabu.main(java.lang.String [])

  • JAVA テキストからの読み込みについて

    以下はsample121.txtというファイルからデータを読み込むプログラムとして とある本に紹介されていた方法を参考にしたものですが while文の中に1文字目を表示したら、2文字めに移行する指示がなされていないように思い 実際に書いて、実行してみましたところ やはり1文字目だけが延々と羅列される結果となりました。 一文字ずつ順番に読み込むとすれば どこを修正すればいいでしょうか。 よろしくお願いします。 import java.io.FileReader; public class traning7 { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ try { FileReader fw = new FileReader("sample121.txt"); int i = fw.read(); while(i != -1){ char c = (char) i ; System.out.println(c); } System.out.println("ファイルの末尾に到達しました。"); fw.close(); }catch(Exception e){ System.out.println("error"); } } }

    • ベストアンサー
    • Java
  • JavaでXMLといったら何を使いますか?

    JavaでXMLファイルを取り扱うときには、DOM, SAX, xerces, relaxer, XMLSchema, XPathといったキーワードが出てきますが、とりあえずXMLファイルを読めればいい、というときはどのライブラリを使うのがいいのでしょうか? 利用目的としては、単純なXMLからデータを読み込んで、それをVelocityテンプレートとマージしてファイルに保存することを考えています。 例 <javafile>  <name>Foo.java</name>  <class>   <modifier>public</modifier>   <name>Foo</name>   <method>    <modifier>public</modifier>    <modifier>static</modifier>    <type>void</type>    <name>main</name>    <arg>     <type>String[]</type>     <name>args</name>    </arg>    <body>     System.out.println("Hello");    </body>   </method>  </class> </javafile> から public class Foo{  public static void main(String[] args){   System.out.println("Hello");  } } を作る感じです。

    • ベストアンサー
    • Java
  • java repaint()に関して

    プログラムで以下のpaintComponents内のデバックができません。 理由は一体何なのでしょうか? お願いします。 import java.awt.Graphics; import javax.swing.JPanel; public class MainPanel extends JPanel implements Runnable { Thread th; public MainPanel() { super(); } public void movestart() { th = new Thread(this); th.start(); } public void paintComponent(Graphics g) { System.out.println("このデバックができない"); super.paintComponent(g); } public void run() { while (true) { System.out.println("ここのデバックはできている"); repaint(); try { th.sleep(100); } catch (Exception e) { } } } }

    • ベストアンサー
    • Java
  • java

    次のコード中の括弧内で下に示す11通りの各コードを実行した場合の実行画面を正確に答えよ。 class A{ public void func1(){System.out.println("A1");} public void func2(){System.out.println("A2");} } class B extends A{ public void func1(){System.out.println("B");} } class C{ public int x=0, y=1; } class D extends C{ public int x=2; public void func1(int x){System.out.println(x);} public void func2(int x){System.out.println(this.x);} public void func3(int x){System.out.println(super.x);} public void func4(int x){System.out.println(this.y);} public void func5(int x){System.out.println(super.y);} } class E{ public void func1(int n){ try{ System.out.println("E1"); int[] ary=new int[n]; System.out.println("E2"); }catch(NegativeArraySizeException e){ System.out.println("E3"); }finally{ System.out.println("E4"); } } } (1) A a=new A(); a.func1(); (2) A a=new B(); a.func1(); (3) B b=new B(); b.func1(); (4) B b=new B(); b.func2(); (5) D d=new D(); d.func1(3); (6) D d=new D(); d.func2(3); (7) D d=new D(); d.func3(3); (8) D d=new D(); d.func4(3); (9) D d=new D(); d.func5(3); (10) E e=new E(); e.func1(5); (11) E e=new E(); e.func1(-2); (1) A1 (2)B (3)B (4) A2 (5) 3 (6) 2 (7) 0 (8) 1 (9) 1 (10) E1E2E4(11) E1E3E4 と答えになるんですがなぜこうなるのかわかりません。教えてください

    • ベストアンサー
    • Java
  • JAXPのDTD検証

    JAXPを使ってXMLの解析をしてるのですが、DTD検証を無効にする方法はあるのでしょうか? XMLに、DTDが記述されているとURLを参照しようとしてエラーになってしまいます。 これを無視するようにしたいのですが。。 ---ソース--- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(false); factory.setIgnoringComments(true); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse( "hoge._xml" );

    • ベストアンサー
    • Java
  • 現在、JAVAのXML/DOMを利用して

    現在、JAVAのXML/DOMを利用して XMLを生成してタグ、インデントを含めそのまま WEBブラウザに出力するようにしたいと思っていますが、 この場合、XMLのタグがWEBブラウザでタグと認識され、除去されてしまいます。 XMLのタグを除去せず、そのまま画面に表示することは可能でしょうか? 可能であれば、その方法を教えていただけませんか? 宜しくお願いします。 今書いているコード DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder; builder = factory.newDocumentBuilder(); DOMImplementation domImpl = builder.getDOMImplementation(); Document document = domImpl.createDocument("","test",null); Element test = document.getDocumentElement(); Element aiueoNode = document.createElement("AAA"); Element abcdeNode = document.createElement("BBB"); aiueoNode.appendChild(document.createTextNode("あいうえお"); abcdeNode.appendChild(document.createTextNode("ABCDE"); test.appendChild(aiueoNode); test.appendChild(abcdeNode); TransformerFactory tf = TransformerFactoryImpl.newInstance(); tf.setAttribute(TransformerFactoryImpl.INDENT_NUMBER, "2"); Transformer transformer = tf.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.METHOD, "xml"); PrintWriter out = new PrintWriter(response.getOutputStream(), true); StringWriter writer = new StringWriter(); StreamResult result = new StreamResult(writer); DOMSource source = new DOMSource(document); transformer.transform(source, result); /**XMLを文字列にして出力**/ out.println(writer.toString()); 現在IE出力例は「あいうえおABCDE」ですが、下記のように出力したいです。 「<test>     <AAA>あいうえお</AAA>     <BBB>ABCDE</BBB> </test>」 宜しくお願いします。 java:1.6/tomcat:6.0/IE:8

    • ベストアンサー
    • Java

専門家に質問してみよう