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_Java 8_Extract_Xpath 1.0 - Fatal编程技术网

Java 从XML节点提取度量值

Java 从XML节点提取度量值,java,xml,java-8,extract,xpath-1.0,Java,Xml,Java 8,Extract,Xpath 1.0,我正在使用Java8和XmlPath 1.0解析大型XML。我想提取,测试的名称,他的测量值和结果(通过或失败)。 每个测试可以有多个TestResult,其中包含两种类型的限制之一: SingleLimit,只有一个 LimitPair始终有两个限制 <tr:Test ID = "282" name = "DIP1-8 High"> <tr:Extension> <ts:TSStepProperties>

我正在使用Java8和XmlPath 1.0解析大型XML。我想提取,测试的名称,他的测量值和结果(通过或失败)。 每个测试可以有多个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度量并创建包含值的字符串

我的问题是如何编写代码/XPath来处理一个测试中可能出现的多个测试结果

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

例如,如果testid=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();
    }
}
private ArrayList preparePairLimitPaths(){
最终ArrayList=新ArrayList();
添加(“//Test[TestResult//LimitPair]/@name”);
添加(“//Test/TestResult[TestLimits//LimitPair]/TestData/Datum/@value”);
添加(“//Test/TestResult/TestLimits/Limits/LimitPair/LimitPair[*]/Datum/@value”);
添加(“//Test/TestResult/TestLimits/Limits/LimitPair/LimitPair[*]/Datum/@value”);
添加(“//Test[TestResult//TestLimits//LimitPair]/output/@value”);
退货清单;
}
for(字符串表达式:PreparePairLimitPath){
试一试{
final NodeList evaluate=(NodeList)xPath.evaluate(expr、parse、XPathConstants.NODESET);
对于(int i=0;i
您可以迭代每个测试,然后迭代每个测试结果,然后将逻辑与TestLimits等放在一起

nodelistalltests=(NodeList)xPath.evaluate(“/xml/Test”,xmlDocument,xpathcontents.NODESET);
对于(int i=0;ifor(intj=0;jj像个符咒一样工作。非常感谢
    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)));
        }
    }