xpath, анализирующий несколько значений за один вызов

#java #xml #xpath

#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>
  

и мне нужны значения для :

:Связь /Номер : Идентификация / Идентификатор файла: Специальность

за один вызов.

Для одного значения я использую

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

Мой желаемый результат — это одна объединенная строка 5551234444616A

Ответ №1:

Вы могли бы попробовать использовать что-то вроде…

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

Который должен объединять результаты каждого запроса. В моем (простом) тесте я получил 3 совпадения (2 для Communication/Number и 1 для 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);
}
  

Комментарии:

1. использование этого возвращает только значение последнего выражения xpath, которое является значением //Identification /FileID 616, оно не объединяет и возвращает 5551234444616

2. Извините, я использовал его для возврата NodeList

3. В моем тесте он вернул первое совпадение. Я не думаю, что STRING способен делать то, что вы пытаетесь сделать…

4. Значит, в nodelist будут все значения?? и я могу повторить список и получить отдельные значения?

5. XPathConstants.NODELIST больше не выглядит нормально, должно быть NODESET . Смотрите — docs.oracle.com/javase/7/docs/api/javax/xml/xpath /…

Ответ №2:

Начиная с Java 7, список узлов заменен на 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);
}