Java 读取包含多个元素的XML
我正在做一个项目,需要从一个XML文件中读取孩子和子孩子,我必须打印每年的信息(每个月都有相应的天数) 这是我的XML文件:Java 读取包含多个元素的XML,java,xml,Java,Xml,我正在做一个项目,需要从一个XML文件中读取孩子和子孩子,我必须打印每年的信息(每个月都有相应的天数) 这是我的XML文件: <?xml version="1.0"?> <Forecast> <year name="2016"> <currentyear>2016</currentyear> <month name="May"> <currentmonth>May</curr
<?xml version="1.0"?>
<Forecast>
<year name="2016">
<currentyear>2016</currentyear>
<month name="May">
<currentmonth>May</currentmonth>
<day name="Monday">
<currentday>Monday</currentday>
<date>22</date>
<temperature>29</temperature>
<weather>sunny</weather>
<humidity>30</humidity>
</day>
<day name="Tuesday">
<currentday>Tuesday</currentday>
<date>23</date>
<temperature>31</temperature>
<weather>sunny</weather>
<humidity>40</humidity>
</day>
<day name="Wednesday">
<currentday>Wednesday</currentday>
<date>24</date>
<temperature>24</temperature>
<weather>rainy</weather>
<humidity>60</humidity>
</day>
<day name="Thursday">
<currentday>Thursday</currentday>
<date>25</date>
<temperature>33</temperature>
<weather>sunny</weather>
<humidity>30</humidity>
</day>
</month>
<month name="June">
<currentmonth>June</currentmonth>
<day name="Monday">
<currentday>Monday</currentday>
<date>13</date>
<temperature>34</temperature>
<weather>sunny</weather>
<humidity>30</humidity>
</day>
<day name="Tuesday">
<currentday>Tuesday</currentday>
<date>14</date>
<temperature>37</temperature>
<weather>sunny</weather>
<humidity>25</humidity>
</day>
<day name="Wednesday">
<currentday>Wednesday</currentday>
<date>15</date>
<temperature>36</temperature>
<weather>sunny</weather>
<humidity>20</humidity>
</day>
<day name="Thursday">>
<currentday>Thursday</currentday>
<date>16</date>
<temperature>39</temperature>
<weather>sunny</weather>
<humidity>15</humidity>
</day>
</month>
</year>
问题是我的输出应该是:
Root element:Forecast
Total number of years:1
Total number of months:2
Total number of days:8
Year:2016
Month:May
Day:Monday
Date:22
Temperature:29 degrees
Weather:sunny
Humidity:30%
Day:Tuesday
Date:23
Temperature:31 degrees
Weather:sunny
Humidity:40%
Day:Wednesday
Date:24
Temperature:24 degrees
Weather:rainy
Humidity:60%
Day:Thursday
Date:25
Temperature:33 degrees
Weather:sunny
Humidity:30%
Month:June
Day:Monday
Date:13
Temperature:34 degrees
Weather:sunny
Humidity:30%
Day:Tuesday
Date:14
Temperature:37 degrees
Weather:sunny
Humidity:25%
Day:Wednesday
Date:15
Temperature:36 degrees
Weather:sunny
Humidity:20%
Day:Thursday
Date:16
Temperature:39 degrees
Weather:sunny
Humidity:15%
有人能帮我解决这个问题吗?这是一个非常粗糙的方法。对于这些年的变化,您将必须实现它(现在我只按月份进行聚合。您将必须按年份和月份进行聚合)
DocumentBuilderFactory docBuild=DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder=docBuild.newDocumentBuilder();
Document doc=docBuilder.parse(新文件(“C:\\DevelopmentTools\\3.CODE\\Weather.xml”);
NodeList monthNodes=doc.getElementsByTagName(“月”);
//蒙特诺德。
XPath=XPathFactory.newInstance().newXPath();
对于(int i=0;i
我得到这个输出:
五月份的天数为4天
6月份的天数为4天
这是正确的代码,谢谢@RamachandranGA
try
{
DocumentBuilderFactory docBuild = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuild.newDocumentBuilder();
Document doc = docBuilder.parse(new File("D:\\users\\Popa Andrei\\Java Workspace\\YearForecast\\forecast.xml"));
NodeList monthNodes = doc.getElementsByTagName("month");
// monthNodes.
XPath xPath = XPathFactory.newInstance().newXPath();
for (int i = 0; i < monthNodes.getLength(); i++) {
StringBuilder pathBuilder = new StringBuilder();
pathBuilder.append("/Forecast/year/month[@name=");
pathBuilder.append("'");
Element monthNode = (Element) monthNodes.item(i);
String month = monthNode.getAttribute("name");
pathBuilder.append(month);
pathBuilder.append("']/day");
NodeList monthWiseNodes = (NodeList) xPath.evaluate(pathBuilder.toString(), doc.getDocumentElement(),
XPathConstants.NODESET);
System.out.println(month+":\n");
for(int j = 0 ;j<monthWiseNodes.getLength();j++)
{
Node firstDay = monthWiseNodes.item(j);
if(firstDay.getNodeType() == Node.ELEMENT_NODE)
{
Element firstDayElement = (Element)firstDay;
System.out.println("\tDay:"+firstDayElement.getElementsByTagName("currentday").item(0).getTextContent());
System.out.println("\tDate:"+firstDayElement.getElementsByTagName("date").item(0).getTextContent());
System.out.println("\tTemperature:"+firstDayElement.getElementsByTagName("temperature").item(0).getTextContent()+" degrees");
System.out.println("\tWeather:"+firstDayElement.getElementsByTagName("weather").item(0).getTextContent());
System.out.println("\tHumidity:"+firstDayElement.getElementsByTagName("humidity").item(0).getTextContent()+"%\n");
}
}
}
}catch (SAXParseException err) {
System.out.println ("** Parsing error" + ", line "
+ err.getLineNumber () + ", uri " + err.getSystemId ());
System.out.println(" " + err.getMessage ());
}catch (SAXException e) {
Exception x = e.getException ();
((x == null) ? e : x).printStackTrace ();
}catch (Throwable t) {
t.printStackTrace ();
}
}
试试看
{
DocumentBuilderFactory docBuild=DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder=docBuild.newDocumentBuilder();
Document doc=docBuilder.parse(新文件(“D:\\users\\Popa Andrei\\Java Workspace\\YearForecast\\forecast.xml”);
NodeList monthNodes=doc.getElementsByTagName(“月”);
//蒙特诺德。
XPath=XPathFactory.newInstance().newXPath();
对于(int i=0;i 对于(int j=0;jj,预期输出和实际输出有什么区别?是否只有天气数据(似乎您只需要晴天)对吗?预期输出是最后一个,代码将每个月的所有天数相加,因此对于我来说,我可以有8天,而我应该只有4天相同的7月输出
Root element:Forecast
Total number of years:1
Total number of months:2
Total number of days:8
Year:2016
Month:May
Day:Monday
Date:22
Temperature:29 degrees
Weather:sunny
Humidity:30%
Day:Tuesday
Date:23
Temperature:31 degrees
Weather:sunny
Humidity:40%
Day:Wednesday
Date:24
Temperature:24 degrees
Weather:rainy
Humidity:60%
Day:Thursday
Date:25
Temperature:33 degrees
Weather:sunny
Humidity:30%
Month:June
Day:Monday
Date:13
Temperature:34 degrees
Weather:sunny
Humidity:30%
Day:Tuesday
Date:14
Temperature:37 degrees
Weather:sunny
Humidity:25%
Day:Wednesday
Date:15
Temperature:36 degrees
Weather:sunny
Humidity:20%
Day:Thursday
Date:16
Temperature:39 degrees
Weather:sunny
Humidity:15%
DocumentBuilderFactory docBuild = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuild.newDocumentBuilder();
Document doc = docBuilder.parse(new File("C:\\DevelopmentTools\\3.CODE\\Weather.xml"));
NodeList monthNodes = doc.getElementsByTagName("month");
// monthNodes.
XPath xPath = XPathFactory.newInstance().newXPath();
for (int i = 0; i < monthNodes.getLength(); i++) {
StringBuilder pathBuilder = new StringBuilder();
pathBuilder.append("/Forecast/year/month[@name=");
pathBuilder.append("'");
Element monthNode = (Element) monthNodes.item(i);
String month = monthNode.getAttribute("name");
pathBuilder.append(month);
pathBuilder.append("']/day");
NodeList monthWiseNodes = (NodeList) xPath.evaluate(pathBuilder.toString(), doc.getDocumentElement(),
XPathConstants.NODESET);
System.out.println("For the month of " + month + " number of days is " + monthWiseNodes.getLength());
}
try
{
DocumentBuilderFactory docBuild = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuild.newDocumentBuilder();
Document doc = docBuilder.parse(new File("D:\\users\\Popa Andrei\\Java Workspace\\YearForecast\\forecast.xml"));
NodeList monthNodes = doc.getElementsByTagName("month");
// monthNodes.
XPath xPath = XPathFactory.newInstance().newXPath();
for (int i = 0; i < monthNodes.getLength(); i++) {
StringBuilder pathBuilder = new StringBuilder();
pathBuilder.append("/Forecast/year/month[@name=");
pathBuilder.append("'");
Element monthNode = (Element) monthNodes.item(i);
String month = monthNode.getAttribute("name");
pathBuilder.append(month);
pathBuilder.append("']/day");
NodeList monthWiseNodes = (NodeList) xPath.evaluate(pathBuilder.toString(), doc.getDocumentElement(),
XPathConstants.NODESET);
System.out.println(month+":\n");
for(int j = 0 ;j<monthWiseNodes.getLength();j++)
{
Node firstDay = monthWiseNodes.item(j);
if(firstDay.getNodeType() == Node.ELEMENT_NODE)
{
Element firstDayElement = (Element)firstDay;
System.out.println("\tDay:"+firstDayElement.getElementsByTagName("currentday").item(0).getTextContent());
System.out.println("\tDate:"+firstDayElement.getElementsByTagName("date").item(0).getTextContent());
System.out.println("\tTemperature:"+firstDayElement.getElementsByTagName("temperature").item(0).getTextContent()+" degrees");
System.out.println("\tWeather:"+firstDayElement.getElementsByTagName("weather").item(0).getTextContent());
System.out.println("\tHumidity:"+firstDayElement.getElementsByTagName("humidity").item(0).getTextContent()+"%\n");
}
}
}
}catch (SAXParseException err) {
System.out.println ("** Parsing error" + ", line "
+ err.getLineNumber () + ", uri " + err.getSystemId ());
System.out.println(" " + err.getMessage ());
}catch (SAXException e) {
Exception x = e.getException ();
((x == null) ? e : x).printStackTrace ();
}catch (Throwable t) {
t.printStackTrace ();
}
}