xpath在单个调用中解析多个值

时间:2014-07-03 02:57:02

标签: 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>

我需要以下值:

:通信/数 :识别/写到FileID :特色

一次通话。

对于我正在使用的单个值

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

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

2 个答案:

答案 0 :(得分:4)

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

的内容
XPathExpression expr = xpath.compile("//Communication/Number | //Identification/FileID");

哪个应该结合每个查询的结果。在我的(简单)测试中,我得到了3场比赛(Communication/Number为2,Identification/FileID为1)

<强>更新

预期的结果是返回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);
}

答案 1 :(得分:1)

从Java 7开始,NodeList被NodeSet取代:

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