解析XML并从文件中获取值

时间:2018-04-19 09:53:59

标签: regex xml parsing classification grouping

我需要从我的整个.xml文件中获得准确答案。 假设我们有.xml的一部分:

<trace>
        <string key="concept:name" value="1"/>
        <string key="description" value="Simulated process instance"/>
        <event>
            <string key="org:resource" value="System"/>
            <date key="time:timestamp" value="1970-01-02T12:23:00.000+01:00"/>
            <string key="concept:name" value="Register"/>
            <string key="lifecycle:transition" value="complete"/>
        </event>
        <event>
            <string key="org:resource" value="Tester3"/>
            <date key="time:timestamp" value="1970-01-02T12:23:00.000+01:00"/>
            <string key="concept:name" value="Analyze Defect"/>
            <string key="lifecycle:transition" value="start"/>
        </event>
        <event>
            <string key="defectType" value="6"/>
            <string key="org:resource" value="Tester3"/>
            <string key="lifecycle:transition" value="complete"/>
            <string key="phoneType" value="T2"/>
            <date key="time:timestamp" value="1970-01-02T12:30:00.000+01:00"/>
            <string key="concept:name" value="Analyze Defect"/>
        </event>
        <event>
            <string key="org:resource" value="SolverC1"/>
            <date key="time:timestamp" value="1970-01-02T12:31:00.000+01:00"/>
            <string key="concept:name" value="Repair (Complex)"/>
            <string key="lifecycle:transition" value="start"/>
        </event>
        <event>
            <string key="org:resource" value="SolverC1"/>
            <date key="time:timestamp" value="1970-01-02T12:49:00.000+01:00"/>
            <string key="concept:name" value="Repair (Complex)"/>
            <string key="lifecycle:transition" value="complete"/>
        </event>
        <event>
            <string key="org:resource" value="Tester3"/>
            <date key="time:timestamp" value="1970-01-02T12:49:00.000+01:00"/>
            <string key="concept:name" value="Test Repair"/>
            <string key="lifecycle:transition" value="start"/>
        </event>
        <event>
            <string key="numberRepairs" value="0"/>
            <string key="org:resource" value="Tester3"/>
            <string key="lifecycle:transition" value="complete"/>
            <date key="time:timestamp" value="1970-01-02T12:55:00.000+01:00"/>
            <string key="concept:name" value="Test Repair"/>
            <string key="defectFixed" value="true"/>
        </event>
        <event>
            <string key="   " value="System"/>
            <date key="time:timestamp" value="1970-01-02T13:10:00.000+01:00"/>
            <string key="concept:name" value="Inform User"/>
            <string key="lifecycle:transition" value="complete"/>
        </event>
        <event>
            <string key="numberRepairs" value="0"/>
            <string key="org:resource" value="System"/>
            <string key="lifecycle:transition" value="complete"/>
            <date key="time:timestamp" value="1970-01-02T13:10:00.000+01:00"/>
            <string key="concept:name" value="Archive Repair"/>
            <string key="defectFixed" value="true"/>
        </event>
    </trace>

从这里我需要找到两个确切的“事件”。事件名称以trace形式写入 - &gt;事件 - &gt; string key =“concept:name”value =“ EVENT NAME

其中一个事件应该生命周期:转换值=“开始”,第二个 - “完成”。

从“完整”事件中我需要时间:时间戳值=“时间”并减去“开始”事件时间:时间戳值=“时间”。< / p>

因此,您看到公式为time = time_complete - time_start

问题是时间(时间 - 日期)格式没有用,例如, 1970-01-02T12:30:00.000+01:00我只需要获取12:30:00并使其缩减,以便找到确切的时间过程。

我的想法是在跟踪,所有生命周期转换值以及此跟踪中的所有“时间”中获取所有事件名称,但我发现它太难了,我可以找到正确的方法来执行此操作。以下是我所做的一些代码:

NodeList nodeList = document.getElementsByTagName("trace");
        Element element = (Element) nodeList.item(0);
        NodeList stringList = element.getElementsByTagName("string");

        NodeList dateList = element.getElementsByTagName("date");

        //--- Get all events names ---//

        for (int x = 1, size = stringList.getLength(); x < size; x++) {
            if (stringList.item(x).getAttributes().getNamedItem("key").getNodeValue().contains("concept:name")) {
                eventName.add(stringList.item(x).getAttributes().getNamedItem("value").getNodeValue());
            }
        }

        //--- Get all times of every event in trace ---//

        for (int y = 0, size = dateList.getLength(); y < size; y++) {
            if (dateList.item(y).getAttributes().getNamedItem("key").getNodeValue().contains("time:timestamp")) {
                time.add(dateList.item(y).getAttributes().getNamedItem("value").getNodeValue());
            }
        }

        //--- Get all lifecycle transitions of events ---//

        for (int x = 0, size = stringList.getLength(); x < size; x++) {
            if (stringList.item(x).getAttributes().getNamedItem("key").getNodeValue().contains("lifecycle:transition")) {
                status.add(stringList.item(x).getAttributes().getNamedItem("value").getNodeValue());
            }
        }

1 个答案:

答案 0 :(得分:0)

我想,我用代码解决了我的问题:

SimpleDateFormat str = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'+'SS:SS");
            Date data;

            for (int i = 0; i < time.size(); i++) {

                data = str.parse(time.get(i));
                minutes.add(data.getHours() * 60 + data.getMinutes());
            }

无论如何,谢谢你的帮助:)。