xpath 在一次调用中解析多个值

Gue*_*est 6 java xml xpath

如何在一次调用中获取多个路径的 xPath 值。

例如

<Message version="010" release="006"  xmlns="http://www.ncpdp.org/schema/SCRIPT" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Header>
</Header>
<Body>
    <CommunicationNumbers>
        <Communication>
            <Number>5551234444</Number>
            <Qualifier>TE</Qualifier>
        </Communication>
        <Communication>
            <Number>5551235555</Number>
            <Qualifier>FX</Qualifier>
        </Communication>
    </CommunicationNumbers>
    <Identification>
        <FileID>616</FileID>
        <DEANumber>AB123456</DEANumber>
        <SocialSecurity>123456789</SocialSecurity>
    </Identification>
    <Specialty>A</Specialty>
    <ClinicName>Therapy Department</ClinicName>
    <Name>
        <LastName>Xavior</LastName>
        <FirstName>Charles</FirstName>
        <MiddleName>C</MiddleName>
        <Suffix>MD</Suffix>
    </Name>
    <Address>
        <AddressLine1>888 ABC Drive</AddressLine1>
        <AddressLine2>Suite 200</AddressLine2>
        <City>Miami</City>
        <State>FL</State>
        <ZipCode>12345</ZipCode>
    </Address>
</Body>
Run Code Online (Sandbox Code Playgroud)

我需要以下值:

:通讯/号码 :身份/文件ID :专业

在一次通话中。

对于我正在使用的单个值

 public static String getExpValue(final String xmlString, final String expression, final ServiceNamespaceContext nameSpace) throws XPathExpressionException {
    StringReader strReader = new StringReader(xmlString);
    InputSource inputStr = new InputSource(strReader);
    String result = null;
    try {
        final XPath xpath = XPathFactory.newInstance().newXPath();
        xpath.setNamespaceContext(nameSpace);

        final XPathExpression expr = xpath.compile(expression);
        result = (String) expr.evaluate(inputStr, XPathConstants.STRING);
    } finally {
        strReader = null;
        inputStr = null;
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

我想要的输出是单个连接字符串 5551234444616A

Mad*_*mer 5

你可以尝试使用类似...

XPathExpression expr = xpath.compile("//Communication/Number | //Identification/FileID");
Run Code Online (Sandbox Code Playgroud)

它应该结合每个查询的结果。在我的(简单)测试中,我得到了 3 个匹配项(2 个 forCommunication/Number和 1 个 for Identification/FileID

更新

预期的结果是返回一个NodeList,例如......

NodeList nl = (NodeList)expr.evaluate(inputStr, XPathConstants.NODELIST);
for (int index = 0; index < nl.getLength(); index++) {
    Node node = nl.item(index);
    String value = node.getTextContent();
    System.out.println(value);
}
Run Code Online (Sandbox Code Playgroud)

  • `XPathConstants.NODELIST` 看起来不再正常,应该是 `NODESET`。请参阅 - https://docs.oracle.com/javase/7/docs/api/javax/xml/xpath/XPathConstants.html (2认同)