我正在尝试解析具有以下(非常简化)结构的文档。每个文档可以有一个或多个 ORB 段,每个 ORB 段后跟一个或多个 OBX 段。OBX 段直接与前面的 OBR 段相关。
<obr> ...... </obr>
<obx> ...... </obx>
<obx> ...... </obx>
<obx> ...... </obx>
<obr> ...... </obr>
<obx> ...... </obx>
<obx> ...... </obx>
以下是一个更详细但仍然简化的示例:
<OBR>
<OBR.1>
<OBR.1.1>1</OBR.1.1>
</OBR.1>
<OBR.2/>
<OBR.3>
<OBR.3.1>12345678</OBR.3.1>
<OBR.3.2>PLS</OBR.3.2>
</OBR.3>
<OBR.4>
<OBR.4.1>CRP, LFT, Ue</OBR.4.1>
<OBR.4.2>C Reactive protein, Liver Function Tests, Urea, Elec, Creat</OBR.4.2>
<OBR.4.3>PLS</OBR.4.3>
</OBR.4>
</OBR>
<OBX>
<OBX.1>
<OBX.1.1>1</OBX.1.1>
</OBX.1>
<OBX.2>
<OBX.2.1>NM</OBX.2.1>
</OBX.2>
<OBX.3>
<OBX.3.1>CRP</OBX.3.1>
<OBX.3.2>C-Reactive Protein</OBX.3.2>
<OBX.3.3>PLS</OBX.3.3>
</OBX.3>
</OBX>
我需要开发可以从特定 OBR 段中提取文本以及多个文本的 xPath 表达式/Java 代码。使用以下方法在整个文档中提取索引的第 OBX.3.2 非常简单:
public Object read(String expression, QName returnType, int index) {
expression = "(" + expression + ")[" + Integer.toString(index) + "]";
try {
XPathExpression xPathExpression = xPath.compile(expression);
return xPathExpression.evaluate(xmlDocument, returnType);
} catch (XPathExpressionException ex) {
ex.printStackTrace();
return null;
}
}
但我不确定如何找到与第二个 OBR 相关联的第 OBX.3.2 索引,或者确实如何计算每个 OBR 的 OBX 段数(如果我是新的,我可能会解决问题)。任何指导或建议将不胜感激。
我还尝试了 Kayessian 方法 ($ns1[count(.| $ns2)=count($ns2)]) 来计算元素:
count( //OBR[3]/following-sibling::OBX [ count (.|//OBR[4]/preceding-sibling::OBX) = count(//OBR[4]/preceding-sibling::OBX )])
此表达式给出索引 OBR 和下一个 OBR 下方的 OBX 元素的数量。但是它不能正确处理组中的最后一个 OBR(因为它后面没有 ORB)