2016-09-08 3 views
0

В настоящее время я работаю над небольшим API погоды (от YR.NO) на Java.Java - attributevalue from parents child

API представлен в XML-формате, как показано ниже:
ПРИМЕЧАНИЕ. В одном API есть несколько таких «ящиков», просто другое время на них.
Whole XML shown

<time datatype="forecast" from="2016-09-08T21:00:00Z" to="2016-09-08T21:00:00Z"> 
    <location altitude="47" latitude="59.3293235" longitude="18.0685808"> 
     <temperature id="TTT" unit="celsius" value="12.0"/> 
     <windDirection id="dd" deg="121.8" name="SE"/> 
     <windSpeed id="ff" mps="2.2" beaufort="2" name="Svak vind"/> 
     <windGust id="ff_gust" mps="3.7"/> 
     <humidity value="80.5" unit="percent"/> 
     <pressure id="pr" unit="hPa" value="1016.0"/> 
     <cloudiness id="NN" percent="51.6"/> 
     <fog id="FOG" percent="-0.0"/> 
     <lowClouds id="LOW" percent="51.2"/> 
     <mediumClouds id="MEDIUM" percent="0.0"/> 
     <highClouds id="HIGH" percent="0.8"/> 
     <dewpointTemperature id="TD" unit="celsius" value="8.8"/> 
    </location> 

public void startElement(String uri, String localName, String qName, 
       Attributes attributes) throws SAXException 
{ 
    for (int i = 0; i < attributes.getLength(); i++) 
    { 
     String attributeName = attributes.getLocalName(i); 
     String attributeValue = attributes.getValue(i); 
     System.out.println(attributes.getLocalName(i) + " : " +  attributes.getValue(i)); 

     //if(attributeValue.toLowerCase().indexOf(timeCheck.toLowerCase()) != -1) 
     // { 
     // System.out.println("Temperature: " + attributes.getValue(i)); 
     // } 
} 

С этим^я могу легко отобразить все имена с их значениями, но я не могу понять, как управлять им. То, что я в настоящее время является строкой, которая сохраняет введенный пользователь, как:

String timeCheck = "T"+timeUserInput; 

(Если я вход 15, то timeCheck становится «T15»)
, а затем проверить, если некоторое значение получает этот вход для примера «T21» с этим внутри для петли:

if(attributeValue.toLowerCase().indexOf(timeCheck.toLowerCase()) != -1) 

, а затем, если это правда, я хочу, чтобы напечатать значение температуры, которое в данном случае является «12,0», но я не могу показаться, чтобы найти легкий способ Делать это. Я могу распечатать ВСЕ значения температуры, но я ТОЛЬКО хочу значение температуры в нужное время.

Пробовал, что мне лучше объяснить мою проблему, недавно начатую с Java, спасибо заранее! Если вам нужно объяснение всего, просто скажите мне, и я попробую.

+0

Как вы разбираетесь? XPath? SAX? DOM? JAXB? Как вы застряли? Пожалуйста, улучшите этот вопрос, если это вообще возможно. Я предполагаю, что вы действительно хотите использовать JAXB для преобразования XML в действительные объекты, но я совсем не уверен. –

+0

@HovercraftFullOfEels Я использую SAXParser. Я застрял, потому что не знаю, как получить только это конкретное значение. Я проверю, что делает JAXB! – Widdin

+0

@HovercraftFullOfEels Нравится это: http://imgur.com/PSIF3Zj – Widdin

ответ

0

В ваших целях я бы рекомендовал использовать XPATH Api, специальный язык для запроса XML. Программа будет выглядеть так:

public void getTemperature(org.w3c.dom.Document doc) 
throws javax.xml.transform.TransformerException, javax.xml.xpath.XPathExpressionException 
{ 
    javax.xml.xpath.XPathFactory xpathFactory=javax.xml.xpath.XPathFactory.newInstance(); 
    javax.xml.xpath.XPath xpath=xpathFactory.newXPath(); 
    String temperature=(String)xpath.evaluate("product/time[contains(@from,'"+timeCheck+"')]/location/temperature/@value", doc, javax.xml.xpath.XPathConstants.STRING); 
}