从xml列表中获取平均值

时间:2014-09-16 13:30:21

标签: java xml date loops

我有一个数据列表(USAGE_LIST),其中包含一些字段年份和月份以及使用情况,我想获得使用字段最近3个月的平均值, 我用SimpleDateFormat和getTime()尝试了类似Calendar.getInstance()的东西。 但是因为我没有真正的约会,它做得很好,最好的方法是做什么,请一个例子。谢谢,感谢StackoverFlow

<USAGE_LIST>
            <TOTAL>
            <YEAR>2013</YEAR>
            <MONTH>10</MONTH>
            <USAGE>200</USAGE>
            </TOTAL>
            <TOTAL>
            <YEAR>2013</YEAR>
            <MONTH>11</MONTH>
            <USAGE>250</USAGE>
            </TOTAL>
            <TOTAL>
            <YEAR>2013</YEAR>
            <MONTH>12</MONTH>
            <USAGE>500</USAGE>
            </TOTAL>
            <TOTAL>
            <YEAR>2014</YEAR>
            <MONTH>1</MONTH>
            <USAGE>300</USAGE>
            </TOTAL>
</USAGE_LIST>

5 个答案:

答案 0 :(得分:0)

您仍然可以使用构建Calendar个实例,尝试以下内容:

Calendar calendar = Calendar.getInstance(); //Get a new calendar instance
calendar.clear(); // Clear it
calendar.set(Calendar.MONTH, month); // Set the new month and year
calendar.set(Calendar.YEAR, year);
Date date = calendar.getTime(); //Get you date value

答案 1 :(得分:0)

您可以使用日历:

Calendar c = new GregorianCalendar(year, month, dayOfMonth);

答案 2 :(得分:0)

创建一个日历实例,Calendar.getInstance()Calendar.set到所需日期。您可以使用Calendar.YearCalendar.Month作为参数进行设置。

让我们假设你已经将xml文件读入String[],其中每一行都是数组中的一个元素。只需迭代数组,检查年份和月份,当它们是正确的集合时,再次迭代并解析使用情况。重复3次并计算平均值。

答案 3 :(得分:0)

我为你写了完整的工作范例。它包含XML读取,过滤旧日期和平均使用计数。我使用xpath从XML文件中检索元素。

请注意,您提供的使用列表仅包含超过3个月的日期。因此,要使其工作(并输出除0之外的其他内容),您需要添加/修改它以获得更新的日期。

只需复制并设置此示例,并将使用列表xml文件添加到同一源文件夹。

package com.test;

import java.io.IOException;
import java.util.Calendar;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class AverageUsage {

    public static void main(String[] args) {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder;
        Document doc = null;
        int usageSum = 0;
        int usageCount = 0;

        // Create calendar representing now (used later)
        Calendar threeMonthsBefore = Calendar.getInstance();

        // Subtract 3 months from now
        threeMonthsBefore.add(Calendar.MONTH, -3);

        try {
            builder = factory.newDocumentBuilder();
            doc = builder.parse("src/data.xml");

            // Create XPathFactory object
            XPathFactory xpathFactory = XPathFactory.newInstance();

            // Create XPath object
            XPath xpath = xpathFactory.newXPath();

            // Create xpath expression to query our totals
            XPathExpression expr = xpath.compile("/USAGE_LIST/TOTAL");

            // Evaluate expression result on XML document
            NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);

            // Iterate over all TOTAL elements
            for(int i = 0; i < nodes.getLength(); i++){
                // Current total element
                Element total = (Element)nodes.item(i);

                // Get YEAR, MONTH, USAGE elements from current TOTAL element
                Element year = (Element)total.getElementsByTagName("YEAR").item(0);
                Element month = (Element)total.getElementsByTagName("MONTH").item(0);
                Element usage = (Element)total.getElementsByTagName("USAGE").item(0);

                // Read values as int
                int yearValue = Integer.valueOf(year.getTextContent());
                int monthValue = Integer.valueOf(month.getTextContent());
                int usageValue = Integer.valueOf(usage.getTextContent());

                // Get calendar instance & reset it
                Calendar cal = Calendar.getInstance();
                cal.set(Calendar.HOUR_OF_DAY, 0); // ! clear would not reset the hour of day !
                cal.clear(Calendar.MINUTE);
                cal.clear(Calendar.SECOND);
                cal.clear(Calendar.MILLISECOND);
                cal.clear(Calendar.DATE);

                // Set calendar date
                cal.set(Calendar.YEAR, yearValue);
                cal.set(Calendar.MONTH, monthValue);

                // Check if cal date is less than 3 months old
                if(cal.after(threeMonthsBefore)){
                    usageSum += usageValue;
                    usageCount++;
                }
            }

            if(usageCount > 0){
                float average = usageSum / (float) usageCount;
                System.out.println("Average usage in past 3 months is: " + average);

            }else{
                System.out.println("There were no usage in past 3 months.");
            }


        } catch (ParserConfigurationException | SAXException | IOException
                | XPathExpressionException e) {
            e.printStackTrace();
        }
    }

}

答案 4 :(得分:0)

我不太确定你的意思是&#34;过去三个月&#34;,但让我们假设你的意思是&#34;所有TOTAL元素的平均USAGE,其年份/ MONTH是在今天之前的三个月之内&#34;。

具体取决于您希望日期算术如何工作,在XPath 2.0或XQuery 3.0中可以表示类似

avg(/USAGE_LIST/TOTAL[(current-date() - xs:date(concat(YEAR, '-', MONTH, '-01')
                        gt xs:dayTimeDuration('P90D')]) 

当然,您可以从Java调用许多XPath 2.0和/或XQuery 1.0库;撒克逊人就是其中之一。

上述表达式的确切含义是获取过去90天内每月1日发生的所有月份的平均值。如果你想更准确地说明你的意图是什么,我确信XPath 2.0足以反映它。