2012-04-25 26 views
-1

javaでXMLファイルを読む必要があります。ファイル構造は以下の通りです。JavaでXMLファイルを読む

<?xml version="1.0" encoding="UTF-8"?> 
<xml_tool xmlns:md="http://www.example.com/XT/1.0/"> 
    <md:header> 
     <md:application_version>1.0</md:application_version> 
     <md:export_date>19-04-2012</md:export_date> 
     <md:export_time>14:55</md:export_time> 
     <md:export_user>USER01</md:export_user> 
    </md:header> 
    <md:table table_name="CUSTOMER" key="customer number" record_count="2" column_count="5"> 
     <md:record> 
      <md:column name="customer_number">123456</md:column> 
      <md:column name="reg_date">01-04-2012</md:column> 
      <md:column name="customer_name">Test Customer</md:column> 
      <md:column name="customer_type">Normal </md:column> 
      <md:column name="comments">This is a test record</md:column> 
     </md:record> 
     <md:record> 
      <md:column name="customer_number">555111</md:column> 
      <md:column name="reg_date">02-04-2012</md:column> 
      <md:column name="customer_name">Test Customer</md:column> 
      <md:column name="customer_type">VIP </md:column> 
      <md:column name="comments">This is a test record</md:column> 
     </md:record> 
    </md:table> 
</xml_tool> 

私はHow to read XML file in Java – (DOM Parser)の例を読み、自分の仕事をしようとしています。しかし、私はXMLファイルを正常に読むことができません。

マイコード

try { 

     File fXmlFile = new File("c:\\file.xml"); 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory 
       .newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(fXmlFile); 
     doc.getDocumentElement().normalize(); 

     NodeList nList = doc.getElementsByTagName("md:record"); 

     for (int i = 0; i < nList.getLength(); i++) { 

      Node node = nList.item(i); 
      if (node.getNodeType() == Node.ELEMENT_NODE) { 

       Element eElement = (Element) node; 

       System.out.println(getTagValue("md:column", eElement)); 


      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

private static String getTagValue(String sTag, Element eElement) { 
     NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes(); 

      Node nValue = (Node) nlList.item(0); 

     return nValue.getNodeValue(); 
     } 

と結果は、私は、このXMLファイルを読み込むことができるか

123456 
555111 

のですか?

+2

「...私はできない...」とさらに詳しく説明することができます。あなたは何を試しましたか、何がうまくいかないか(コード)? – home

+0

@home私の質問を更新しました – Bishan

+0

残念ながら、あなたのアップデートはあなたの質問をより明確にしませんでした。 –

答えて

3

あなたのループの...

for (int i = 0; i < nList.getLength(); i++) 
{ 
     Node node = nList.item(i); 
     if (node.getNodeType() == Node.ELEMENT_NODE) 
     {     
      if(eElement.hasChildNodes()) 
      { 
       NodeList nl = node.getChildNodes(); 
       for(int j=0; j<nl.getLength(); j++) 
       { 
        Node nd = nl.item(j); 
        System.out.println(nd.getTextContent()); 
       } 
      } 
     } 
} 
+0

は 'とjava.lang.ClassCastExceptionを得た:com.sun.org.apache.xerces.internal.dom.DeferredTextImplは' \t \t \t \t \t \t \t素子EL =(要素でorg.w3c.dom.Element'にキャストすることはできません)nl.item(j); ' – Bishan

+0

更新された回答を確認してください。 'getTagValue()'メソッドも必要ありません。 –

1

現在あなたは(最初のレベルの子孫に限定されるものではなく、すなわち、getElementsByTagName(...)、)非常に不正確なクエリをやって更新します。 getTagValue(...)では、すべての子のすべてのデータを取得するためにNodeListを反復処理する必要があります。その場合は、メソッドがList<String>を返すようにします。または、より良い方法として、NodeListを他の方法に移動し、そこにループすることができます。

ヘッダーを含むすべてのデータを取得するには、ルートノードからすべての要素を再帰的に反復処理する必要があります。

これは、はるかに良い方法があると言いました。 JAXBを使用して、XMLスキーマをPOJO(通常のJavaオブジェクト)データ・モデルにバインドできます。すべてのロードは自動的に行われ、プログラムロジックに集中することができます。