2015-04-04 61 views
0

我試圖收集來自一個巨大的XML數據,結構如下:我得到錯誤的數據,同時讀取XML

<Ciutats> 
     <Ciutat> 
     <Nom>Torremolinos</Nom> 
     <Provincia>Malaga</Provincia> 
     <Dades> 
      <Dada dia='2015-01-18'> 
      <TempMax>10.4</TempMax> 
      <TempMin>7.0</TempMin> 
      <TempAve>8.7</TempAve> 
      <VMax>8.0</VMax> 
      <VRatxa>28.0</VRatxa> 
      <Prec>29.8</Prec> 
      </Dada> 
      <Dada dia='2015-01-19'> 
      <TempMax>13.1</TempMax> 
      <TempMin>8.7</TempMin> 
      <TempAve>10.9</TempAve> 
      <VMax>29.0</VMax> 
      <VRatxa>64.0</VRatxa> 
      <Prec>6.2</Prec> 
      </Dada> 
      .... 
     </Ciutat> 
     <Ciutat> 
     <Nom>Valdemorillo</Nom> 
     <Provincia>Madrid</Provincia> 
     <Dades> 
      <Dada dia='2015-01-18'> 
      <TempMax>1.7</TempMax> 
      <TempMin>-2.2</TempMin> 
      <TempAve>-0.3</TempAve> 
      <VMax>5.0</VMax> 
      <VRatxa>13.0</VRatxa> 
      <Prec>1.2</Prec> 
      </Dada> 
      <Dada dia='2015-01-19'> 
      <TempMax>3.6</TempMax> 
      <TempMin>0.3</TempMin> 
      <TempAve>1.9</TempAve> 
      <VMax>41.0</VMax> 
      <VRatxa>69.0</VRatxa> 
      <Prec>4.0</Prec> 
      </Dada> 
      ... 
    </Ciutat>  
</Ciutat>   

爲每一個「蘇塔特威拉」你有「喃」,「省報」和「Dades」,每個城市有29個對象,XML共有784個城市。

這裏是我的代碼讀取XML:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     File file = new File(fileName); 
     Document document = builder.parse(file); 

    Element ct = document.getDocumentElement(); 
     NodeList ciutatList = ct.getElementsByTagName("Ciutat"); 
     if (ciutatList != null && ciutatList.getLength() > 0) { 
      for (int i = 0; i < ciutatList.getLength(); i++) { 

       Element ciutats = (Element) ciutatList.item(i); 
       NodeList nomList = ciutats.getElementsByTagName("Nom"); 
       if (nomList != null && nomList.getLength() > 0) { 
        Element nomElement = (Element) nomList.item(0); 
        nom = nomElement.getFirstChild().getNodeValue(); 
       } 

       NodeList provList = ciutats.getElementsByTagName("Provincia"); 
       if (provList != null && provList.getLength() > 0) { 
        Element provElement = (Element) provList.item(0); 
        prov = provElement.getFirstChild().getNodeValue(); 
       } 

       tc = new TempsCiutat(nom, prov, 1000); 

       NodeList dadesList = ct.getElementsByTagName("Dades"); 
       Element dadesElement = (Element) dadesList.item(0); 

       NodeList dadaList = dadesElement.getElementsByTagName("Dada"); 
       for (int a = 0; a < dadaList.getLength(); a++) { 
        Date data = null; 
        float tempMax = 0, tempMin = 0, tempAve = 0, VMax = 0, VRatxa = 0, prec = 0; 

        Element dades = (Element) dadaList.item(a); 

        String dataS = dades.getAttribute("dia"); 
        data = df.parse(dataS); 

        NodeList tempMaxList = dades.getElementsByTagName("TempMax"); 
        if (tempMaxList != null && tempMaxList.getLength() > 0) { 
         Element tempMaxElement = (Element) tempMaxList.item(0); 
         String tempMaxS = tempMaxElement.getFirstChild().getNodeValue(); 
         tempMax = Float.parseFloat(tempMaxS); 
        } 

        NodeList tempMinList = dades.getElementsByTagName("TempMin"); 
        if (tempMinList != null && tempMinList.getLength() > 0) { 
         Element tempMinElement = (Element) tempMinList.item(0); 
         String tempMinS = tempMinElement.getFirstChild().getNodeValue(); 
         tempMin = Float.parseFloat(tempMinS); 
        } 
        NodeList tempAveList = dades.getElementsByTagName("TempAve"); 
        if (tempAveList != null && tempAveList.getLength() > 0) { 
         Element tempAveElement = (Element) tempAveList.item(0); 
         String tempAveS = tempAveElement.getFirstChild().getNodeValue(); 
         tempAve = Float.parseFloat(tempAveS); 
        } 
        NodeList VmaxList = dades.getElementsByTagName("VMax"); 
        if (VmaxList != null && VmaxList.getLength() > 0) { 
         Element VmaxElement = (Element) VmaxList.item(0); 
         String VMaxS = VmaxElement.getFirstChild().getNodeValue(); 
         VMax = Float.parseFloat(VMaxS); 
        } 
        NodeList VRatxaList = dades.getElementsByTagName("VRatxa"); 
        if (VRatxaList != null && VRatxaList.getLength() > 0) { 
         Element VRatxaElement = (Element) VRatxaList.item(0); 
         String VRatxaS = VRatxaElement.getFirstChild().getNodeValue(); 
         VRatxa = Float.parseFloat(VRatxaS); 
        } 
        NodeList precList = dades.getElementsByTagName("Prec"); 
        if (precList != null && precList.getLength() > 0) { 
         Element precElement = (Element) precList.item(0); 
         String precS = precElement.getFirstChild().getNodeValue(); 
         prec = Float.parseFloat(precS); 
        } 
        TempsDia dia = new TempsDia(data, tempMax, tempMin, tempAve, VMax, VRatxa, prec); 

        tc.afegirTempsDia(dia); 
       } 

       tp.afegirCiutat(tc); 
      } 

     } 

現在的問題是,當我讀到的第一個城市它確實是正確的,但是,當涉及到讀取第二,名字和「 Provincia「是正確的,但是」Dades「與第一個城市相同,我想知道是否必須以某種方式關閉達達閱讀。

回答

1

你有文件:

Element ct = document.getDocumentElement(); 

你得到許多城市的正確的節點列表:

NodeList ciutatList = ct.getElementsByTagName("Ciutat"); 

但是你通過

NodeList dadesList = ct.getElementsByTagName("Dades"); 

這是從整個拿到Dades文件,所以你再次得到第一個Dades。相反,迭代NodeList ciutatList並且調用

NodeList dades = 
    (Element) ciutatList.item(i).getElementsByTagName("Dades"); 

PS:爲什麼不使用JAXB?

+0

我意識到,幾分鐘前^^」,這是一個單向的分配,所以我們必須這樣做,這樣,感謝您的回答:) – manutheking 2015-04-04 19:08:41

0

好的,我覺得很愚蠢。

NodeList dadesList = ct.getElementsByTagName("Dades"); 
Element dadesElement = (Element) dadesList.item(0); 

它實際上是:

NodeList dadesList = ciutats.getElementsByTagName("Dades"); 
Element dadesElement = (Element) dadesList.item(0);