Получить значения из мыльного ответа в Java

Я вызываю метод веб-службы через клиент веб-службы, созданный в среде IDE NetBeans.

 private String getCitiesByCountry(java.lang.String countryName) {
        webService.GlobalWeatherSoap port = service.getGlobalWeatherSoap();
        return port.getCitiesByCountry(countryName);
    }

Так что я называю этот метод внутри моей программы,

String b = getWeather("Katunayake", "Sri Lanka"); 

и он даст мне вывод строки, который содержит данные XML.

String b = getWeather("Katunayake", "Sri Lanka"); = (java.lang.String) <?xml version="1.0" encoding="utf-16"?>
<CurrentWeather>
  <Location>Katunayake, Sri Lanka (VCBI) 07-10N 079-53E 8M</Location>
  <Time>Jun 22, 2015 - 06:10 AM EDT / 2015.06.22 1010 UTC</Time>
  <Wind> from the SW (220 degrees) at 10 MPH (9 KT):0</Wind>
  <Visibility> greater than 7 mile(s):0</Visibility>
  <SkyConditions> partly cloudy</SkyConditions>
  <Temperature> 86 F (30 C)</Temperature>
  <DewPoint> 77 F (25 C)</DewPoint>
  <RelativeHumidity> 74%</RelativeHumidity>
  <Pressure> 29.74 in. Hg (1007 hPa)</Pressure>
  <Status>Success</Status>
</CurrentWeather>

Как я могу получить значение <Location>,<SkyConditions>,<Temperature>,

2 ответа

Решение

Вы можете пойти на XPath если вам нужны только эти 3 значения. Иначе, DOM читает весь документ Это очень легко написать XPath expressions они напрямую выбирают узел для чтения значений.

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
try {
    builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
    e.printStackTrace();  
}
String xml = ...; // <-- The XML SOAP response
Document xmlDocument = builder.parse(new ByteArrayInputStream(xml.getBytes()));
XPath xPath =  XPathFactory.newInstance().newXPath();
String location = xPath.compile("/CurrentWeather/Location").evaluate(xmlDocument);
String skyCond = xPath.compile("/CurrentWeather/SkyConditions").evaluate(xmlDocument);
String tmp = xPath.compile("/CurrentWeather/Temperature").evaluate(xmlDocument);

Если вам нужно извлекать много узлов XML и часто, тогда перейдите к DOM,

Одним из способов является использование DOM-парсера, используя http://examples.javacodegeeks.com/core-java/xml/java-xml-parser-tutorial в качестве руководства:

String b = getWeather("Katunayake", "Sri Lanka"); 
InputStream weatherAsStream = new ByteArrayInputStream(b.getBytes(StandardCharsets.UTF_8));

DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = fac.newDocumentBuilder();
org.w3c.dom.Document weatherDoc = builder.parse(weatherAsStream);

String location = weatherDoc.getElementsByTagName("Location").item(0).getTextContent();
String skyConditions = weatherDoc.getElementsByTagName("SkyConditions").item(0).getTextContent();
String temperature = weatherDoc.getElementsByTagName("Temperature").item(0).getTextContent();

Это не имеет обработки исключений и может сломаться, если есть более одного элемента с одинаковым именем, но вы должны быть в состоянии работать отсюда.

Другие вопросы по тегам