我试图从巨大的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>
每个&#34; Ciutat&#34;你有&#34; Nom&#34; &#34;省报&#34;和&#34; Dades&#34;每个城市有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);
}
}
现在的问题是,当我读到第一个城市时,它是正确的,但是,当涉及到阅读第二个,名称和&#34; Provincia&#34;是正确的,但是&#34; Dades&#34;和第一个城市一样,我想知道我是否必须以某种方式关闭Dada。
答案 0 :(得分:1)
你有文件:
Element ct = document.getDocumentElement();
您可以获得城市的正确节点列表:
NodeList ciutatList = ct.getElementsByTagName("Ciutat");
但是你可以通过
获得DadesNodeList dadesList = ct.getElementsByTagName("Dades");
来自整个文档,所以你再次获得第一个Dades。相反,迭代NodeList ciutatList并调用
NodeList dades =
(Element) ciutatList.item(i).getElementsByTagName("Dades");
PS:为什么不使用JAXB?
答案 1 :(得分:0)
好的,我觉得很蠢。
在
NodeList dadesList = ct.getElementsByTagName("Dades");
Element dadesElement = (Element) dadesList.item(0);
实际上是:
NodeList dadesList = ciutats.getElementsByTagName("Dades");
Element dadesElement = (Element) dadesList.item(0);
答案 2 :(得分:0)
我知道这是一项学校作业,但是看看xpath可以更容易地获得这种数据。