2012-04-25 128 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(); 
     } 

和結果

123456 
555111 

我怎麼能讀這個XML文件?

+2

也許你可以進一步闡述'...我無法......'。你嘗試過什麼,什麼不起作用(代碼)? – home 2012-04-25 07:00:41

+0

@home我已更新我的問題 – Bishan 2012-04-25 07:06:09

+0

不幸的是,您的更新並未使您的問題更清楚。 – 2012-04-25 07:14:05

回答

3

更新您的for循環...

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 2012-04-25 07:26:12

+0

檢查更新後的答案。你也不需要'getTagValue()'方法。 – 2012-04-25 07:38:42

1

目前你正在做的非常不準確的查詢(即getElementsByTagName(...),這並不侷限於一級後裔)。在getTagValue(...)中,您需要遍歷NodeList以獲取所有孩子的所有數據 - 在這種情況下,您可能希望該方法返回List<String>。或者,更好的辦法是,將那個NodeList移動到其他方法並在那裏循環。

要獲取所有數據(包括頭文件),您需要遞歸迭代所有元素,從根節點開始。

這就是說,有一個更好的方法。您可以使用JAXB將XML模式綁定到POJO(普通Java對象)數據模型。然後所有的加載都會自動完成,你可以專注於程序邏輯。