java-从XML节点提取度量

我正在使用Java 8和XmlPath 1.0解析大型XML.我要提取测试名称,他的测量值和结果(通过或失败).
每个测试可以具有许多TestResult,其中包含两种类型的限制之一:

> SingleLimit,只有一个<限制比较器=“ XYZ”>
> LimitPair将始终具有两个限制

<tr:Test ID = "282" name = "DIP1-8 High">  
    <tr:Extension>
        <ts:TSStepProperties>
            ...
        </ts:TSStepProperties>
    </tr:Extension>
    <tr:Outcome value = "Passed" /> <!-- value -->
    <tr:TestResult ID = "xyz" name = "TC 8.7.4 - Current breaker output J10:1-2"> <!-- name -->
    <tr:TestLimits>
        <tr:Limits>
            <c:LimitPair operator = "AND">
                <c:Limit comparator = "GE">
                    <!-- value -->
                    <c:Datum nonStandardUnit = "V" value = "2.8" xsi:type="ts:TS_double" flags = "0x0000"/> 
                </c:Limit>
                <c:Limit comparator = "LE">
                    <!-- value -->
                    <c:Datum nonStandardUnit = "V" value = "3.5" xsi:type="ts:TS_double" flags = "0x0000"/>
                </c:Limit>
            </c:LimitPair>
        </tr:Limits>
        </tr:TestLimits>
    </tr:TestResult>
</tr:Test>

目前,我正在使用这些路径来提取PairLimit测量值并创建包含值的String.

我的问题是我应该如何编写代码/ xPath来照顾一个测试中可能存在的许多TestResults.

我在一开始就认为Test只能具有PairLimit或SingleLimit,这是错误的.
我当前的代码正确地提取了所有值,但是当Test中有许多TestResults时,分配的测量值是不正确的.

例如,如果Test ID = 1包含3(三个)TestResult,那么在包含度量的最终String中,我将在第二个内部包含第一个Test的值,因为它将“覆盖”这些值.

        private ArrayList<String> preparePairLimitPaths() {
    final ArrayList<String> list = new ArrayList<>();
    list.add("//Test[TestResult//LimitPair]/@name");
    list.add("//Test/TestResult[TestLimits//LimitPair]/TestData/Datum/@value");
    list.add("//Test/TestResult/TestLimits/Limits/LimitPair/Limit[*]/Datum/@value");
    list.add("//Test/TestResult/TestLimits/Limits/LimitPair/Limit[*]/Datum/@value");
    list.add("//Test[TestResult//TestLimits//LimitPair]/Outcome/@value");
    return list;
}
for (String expr : preparePairLimitPaths) {
    try {
        final NodeList evaluate = (NodeList) xPath.evaluate(expr, parse, XPathConstants.NODESET);
        for (int i = 0; i < evaluate.getLength(); i++) {
            final String textContent = evaluate.item(i).getTextContent();
            if (textContent != null && !textContent.isEmpty()) {
                stringBuilder.append(textContent).append(";");
            }
        }
        stringBuilder.append("@@@");
    } catch (XPathExpressionException e) {
        e.printStackTrace();
    }
}

解决方法:

您可以只遍历每个测试,然后遍历每个TestResult,然后将逻辑与TestLimits等一起放置.

    NodeList allTests = (NodeList) xPath.evaluate("/xml/Test", xmlDocument, XPathConstants.NODESET);
    for (int i = 0; i < tests.getLength(); i++) {
        Element singleTest = (Element) tests.item(i);
        // Here, you can extract some values from your test like:
        // testOutcome = xPath.evaluate("Outcome/@value", singleTest);

        NodeList testResults = (NodeList) xPath.evaluate("TestResult",test, XPathConstants.NODESET);

        for (int j=0; j<testResults.getLength(); j++) {
            // Now you can iterate over all your testResults from test
            // testResultName = xPath.evaluate("@name",testResults.item(j)));
        }
    }
上一篇:Java-Regexp组匹配异常


下一篇:Solution -「CF 600A」Extract Numbers