【问题标题】:Extract measurements from XML nodes从 XML 节点中提取测量值
【发布时间】:2019-04-27 13:46:21
【问题描述】:

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

  • SingleLimit,它将只有一个
  • 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 测量值并创建包含值的字符串。

我的问题是我应该如何编写代码/xPaths 来处理一个测试中可能存在的许多测试结果。

一开始我假设 Test 只能有 PairLimit 或 SingleLimit,这是错误的。 我当前的代码正确提取了所有值,但是当 Test 中有很多 TestResults 时分配的测量值不正确。

例如,如果测试 ID = 1 包含 3(三)个 TestResults,那么在包含测量值的最终字符串中,我将在第二个内部包含来自第一个测试的值,因为它会“覆盖”这些值.

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

【问题讨论】:

    标签: java xml java-8 extract xpath-1.0


    【解决方案1】:

    您可以只遍历每个 Test 然后遍历每个 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)));
            }
        }
    

    【讨论】:

    • 像魅力一样工作。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 2020-05-05
    • 2015-05-23
    相关资源
    最近更新 更多