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