Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 读取包含多个元素的XML_Java_Xml - Fatal编程技术网

Java 读取包含多个元素的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文件中读取孩子和子孩子,我必须打印每年的信息(每个月都有相应的天数)

这是我的XML文件:

<?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 ();
    }
}