2016-09-08 6 views
0

Ich arbeite derzeit an einer kleinen Wetter API (From YR.NO) in Java.Java - Attributwert von Eltern Kind

Die API ist in XML wie folgt:
HINWEIS: Es gibt mehrere dieser "Boxen" in der gleichen API, nur unterschiedliche Zeit auf ihnen.
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)); 
     // } 
} 

diese mit^i leicht die Namen alle mit ihren Werten angezeigt werden kann, aber ich kann wirklich nicht herausfinden, wie es zu kontrollieren. Was ich habe, ist jetzt ein String, der den Benutzer eingegebenen wie speichert:

String timeCheck = "T"+timeUserInput; 

(Wenn i Eingang 15 dann die Timecheck „T15“ wird)
und dann überprüfe ich, ob irgendein Wert erhält diese Eingabe zum Beispiel „T21“ mit diesem innerhalb der for-Schleife:

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

und dann, wenn wahr ist, möchte ich den Wert der Temperatur drucken, die in diesem Fall „12.0“ aber ich kann nicht eine einfache Möglichkeit zu finden, scheinen es tun. Ich kann ALLE Temperaturwerte drucken, aber ich möchte nur den Temperaturwert der richtigen Zeit.

Ich versuchte mein Bestes, mein Problem zu erklären, vor kurzem mit Java gestartet, Vielen Dank im Voraus! Wenn Sie eine Erklärung für etwas brauchen, sagen Sie es mir einfach und ich werde es versuchen.

+0

Wie werden Sie analysieren? XPath? SAXOPHON? DOM? JAXB? Wie bist du stecken geblieben? Bitte verbessern Sie diese Frage wenn überhaupt möglich. Meine Vermutung ist, dass Sie JAXB tatsächlich verwenden möchten, um eine XML in gültige Objekte zu konvertieren, aber ich bin mir überhaupt nicht sicher. –

+0

@HovercraftFullOfEels Ich benutze SAXParser. Ich stecke fest, weil ich nicht weiß, wie ich nur diesen spezifischen Wert bekomme. Ich werde herausfinden, was JAXB macht! – Widdin

+0

@HovercraftFullOfEels Gefällt mir: http://imgur.com/PSIF3Zj – Widdin

Antwort

0

Für Ihre Zwecke würde ich Ihnen empfehlen, XPATH Api, eine spezielle Sprache, um eine XML zu verwenden. Das Programm würde so sein:

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