从 XML 个节点中提取测量值
Extract measurements from XML nodes
我正在使用 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 测量值并创建包含值的字符串。
我的问题是我应该如何编写 code/xPaths 来处理一个测试中可能出现的多个测试结果。
一开始以为Test只能有PairLimit或SingleLimit,这是错误的。
我当前的代码正确提取了所有值,但是当 Test 中有许多 TestResults 时,分配的测量值不正确。
例如,如果测试 ID = 1 包含 3(三)TestResults,那么在包含测量值的最终字符串中,我将在第二个中包含第一个测试的值,因为它将"override" 值。
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();
}
}
您可以遍历每个 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)));
}
}
我正在使用 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 测量值并创建包含值的字符串。
我的问题是我应该如何编写 code/xPaths 来处理一个测试中可能出现的多个测试结果。
一开始以为Test只能有PairLimit或SingleLimit,这是错误的。 我当前的代码正确提取了所有值,但是当 Test 中有许多 TestResults 时,分配的测量值不正确。
例如,如果测试 ID = 1 包含 3(三)TestResults,那么在包含测量值的最终字符串中,我将在第二个中包含第一个测试的值,因为它将"override" 值。
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();
}
}
您可以遍历每个 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)));
}
}