将对象映射到多个XML模式–天气示例
為了使示例更加“真實(shí)”,XML數(shù)據(jù)將來(lái)自提供天氣信息的兩種不同服務(wù):Google和Yahoo。
Java模型
以下域模型將用于此帖子:
天氣預(yù)報(bào)
package blog.weather;import java.util.List;public class WeatherReport {private String location;private int currentTemperature;private String currentCondition;private List forecast;}預(yù)測(cè)
package blog.weather;public class Forecast {private String dayOfTheWeek;private int low;private int high;private String condition;}Google Weather API
首先,我們將利用Google的Weather API。 以下URL將用于訪問(wèn)加拿大渥太華的天氣數(shù)據(jù):
http://www.google.com/ig/api?weather=渥太華
以下是在我撰寫(xiě)本文時(shí)執(zhí)行上述查詢的結(jié)果。 我已經(jīng)突出顯示了我們將映射到XML文檔的部分:
<xml_api_reply version="1"><weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1"row="0" section="0"><forecast_information><city data="Ottawa, ON" /><postal_code data="Ottawa" /><latitude_e6 data="" /><longitude_e6 data="" /><forecast_date data="2011-09-08" /><current_date_time data="2011-09-08 14:00:00 +0000" /><unit_system data="US" /></forecast_information><current_conditions><condition data="Mostly Cloudy" /><temp_f data="66" /><temp_c data="19" /><humidity data="Humidity: 73%" /><icon data="/ig/images/weather/mostly_cloudy.gif" /><wind_condition data="Wind: NE at 13 mph" /></current_conditions><forecast_conditions><day_of_week data="Thu" /><low data="55" /><high data="75" /><icon data="/ig/images/weather/cloudy.gif" /><condition data="Cloudy" /></forecast_conditions><forecast_conditions><day_of_week data="Fri" /><low data="46" /><high data="77" /><icon data="/ig/images/weather/mostly_sunny.gif" /><condition data="Partly Sunny" /></forecast_conditions><forecast_conditions><day_of_week data="Sat" /><low data="43" /><high data="68" /><icon data="/ig/images/weather/sunny.gif" /><condition data="Clear" /></forecast_conditions><forecast_conditions><day_of_week data="Sun" /><low data="55" /><high data="75" /><icon data="/ig/images/weather/sunny.gif" /><condition data="Clear" /></forecast_conditions></weather> </xml_api_reply>Java模型-通過(guò)注釋映射到Google的XML模式
我們將通過(guò)標(biāo)準(zhǔn)JAXB和MOXy擴(kuò)展注釋的組合來(lái)映射Google weather API的結(jié)果。
天氣預(yù)報(bào)
package blog.weather;import java.util.List;import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType;import org.eclipse.persistence.oxm.annotations.XmlPath;@XmlRootElement(name="xml_api_reply") @XmlType(propOrder={"location", "currentCondition", "currentTemperature", "forecast"}) @XmlAccessorType(XmlAccessType.FIELD) public class WeatherReport {@XmlPath("weather/forecast_information/city/@data")private String location;@XmlPath("weather/current_conditions/temp_f/@data")private int currentTemperature;@XmlPath("weather/current_conditions/condition/@data")private String currentCondition;@XmlPath("weather/forecast_conditions")private List<Forecast> forecast;}預(yù)測(cè)
package blog.weather;import org.eclipse.persistence.oxm.annotations.XmlPath;public class Forecast {@XmlPath("day_of_week/@data")private String dayOfTheWeek;@XmlPath("low/@data")private int low;@XmlPath("high/@data")private int high;@XmlPath("condition/@data")private String condition;}演示版
以下演示代碼將讀取Google氣象服務(wù)的XML數(shù)據(jù),并將對(duì)象編組回XML:
package blog.weather;import java.net.URL; import javax.xml.bind.*;public class GoogleDemo {public static void main(String[] args) throws Exception {JAXBContext jc = JAXBContext.newInstance(WeatherReport.class);Unmarshaller unmarshaller = jc.createUnmarshaller();URL url = new URL("http://www.google.com/ig/api?weather=Ottawa");WeatherReport weatherReport = (WeatherReport) unmarshaller.unmarshal(url);Marshaller marshaller = jc.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);marshaller.marshal(weatherReport, System.out);}}輸出量
以下是運(yùn)行演示代碼的結(jié)果。 輸出代表我們映射到的XML文檔的一部分:
<?xml version="1.0" encoding="UTF-8"?> <xml_api_reply><weather><forecast_information><city data="Ottawa, ON"/></forecast_information><current_conditions><condition data="Mostly Cloudy"/><temp_f data="68"/></current_conditions><forecast_conditions><day_of_week data="Thu"/><low data="55"/><high data="75"/><condition data="Cloudy"/></forecast_conditions><forecast_conditions><day_of_week data="Fri"/><low data="46"/><high data="77"/><condition data="Partly Sunny"/></forecast_conditions><forecast_conditions><day_of_week data="Sat"/><low data="43"/><high data="68"/><condition data="Clear"/></forecast_conditions><forecast_conditions><day_of_week data="Sun"/><low data="55"/><high data="75"/><condition data="Clear"/></forecast_conditions></weather> </xml_api_reply>雅虎天氣API
以下URL將用于使用Yahoo Weather API(3369是渥太華的WOEID)訪問(wèn)渥太華的天氣數(shù)據(jù):
http://weather.yahooapis.com/forecastrss?w=3369
以下是在我撰寫(xiě)本文時(shí)執(zhí)行上述查詢的結(jié)果:
<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0"xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"><channel><title>Yahoo! Weather - Ottawa, CA</title><link>http://us.rd.yahoo.com/dailynews/rss/weather/Ottawa__CA/*http://weather.yahoo.com/forecast/CAXX0343_f.html</link><description>Yahoo! Weather for Ottawa, CA</description><language>en-us</language><lastBuildDate>Thu, 08 Sep 2011 10:58 am EDT</lastBuildDate><ttl>60</ttl><yweather:location city="Ottawa" region="ON"country="Canada" /><yweather:units temperature="F" distance="mi" pressure="in"speed="mph" /><yweather:wind chill="66" direction="40" speed="12" /><yweather:atmosphere humidity="73" visibility=""pressure="30.14" rising="0" /><yweather:astronomy sunrise="6:31 am" sunset="7:25 pm" /><image><title>Yahoo! Weather</title><width>142</width><height>18</height><link>http://weather.yahoo.com</link><url>http://l.yimg.com/a/i/brand/purplelogo//uh/us/news-wea.gif</url></image><item><title>Conditions for Ottawa, CA at 10:58 am EDT</title><geo:lat>45.42</geo:lat><geo:long>-75.69</geo:long><link>http://us.rd.yahoo.com/dailynews/rss/weather/Ottawa__CA/*http://weather.yahoo.com/forecast/CAXX0343_f.html</link><pubDate>Thu, 08 Sep 2011 10:58 am EDT</pubDate><yweather:condition text="Mostly Cloudy" code="28"temp="66" date="Thu, 08 Sep 2011 10:58 am EDT" /><description><![CDATA[ <img src="http://l.yimg.com/a/i/us/we/52/28.gif"/><b>Current Conditions:</b>Mostly Cloudy, 66 F<b>Forecast:</b>Thu - Partly Cloudy. High: 75 Low: 57Fri - Partly Cloudy. High: 79 Low: 53<a href="http://us.rd.yahoo.com/dailynews/rss/weather/Ottawa__CA/*http://weather.yahoo.com/forecast/CAXX0343_f.html">Full Forecast at Yahoo! Weather</a>(provided by <a href="http://www.weather.com" >The Weather Channel</a>)]]></description><yweather:forecast day="Thu" date="8 Sep 2011" low="57"high="75" text="Partly Cloudy" code="30" /><yweather:forecast day="Fri" date="9 Sep 2011" low="53"high="79" text="Partly Cloudy" code="30" /><guid isPermaLink="false">CAXX0343_2011_09_09_7_00_EDT</guid></item></channel> </rss><!-- api4.weather.sp2.yahoo.com uncompressed/chunked Thu Sep 8 08:32:54PDT 2011 -->Java模型–通過(guò)XML元數(shù)據(jù)映射到Y(jié)ahoo的XML模式
由于我們無(wú)法通過(guò)注釋提供到對(duì)象模型的第二套映射,因此我們必須利用MOXy的XML元數(shù)據(jù)提供后續(xù)的映射。 默認(rèn)情況下,MOXy的映射文檔用于補(bǔ)充模型上指定的所有注釋。 但是,如果設(shè)置了xml-mapping-metadata-complete標(biāo)志,則XML元數(shù)據(jù)將完全替換注釋提供的元數(shù)據(jù)(用于Google映射的注釋將保留在POJO上,但是xml-mapping-metadata-complete標(biāo)志告訴MOXy忽略它們)。
<?xml version="1.0"?> <xml-bindingsxmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"package-name="blog.weather"xml-mapping-metadata-complete="true"><xml-schema element-form-default="QUALIFIED"><xml-ns prefix="yweather" namespace-uri="http://xml.weather.yahoo.com/ns/rss/1.0"/></xml-schema><java-types><java-type name="WeatherReport" xml-accessor-type="FIELD"><xml-root-element name="rss"/><xml-type prop-order="location currentTemperature currentCondition forecast"/><java-attributes><xml-attribute java-attribute="location" xml-path="channel/yweather:location/@city"/><xml-attribute java-attribute="currentTemperature" name="channel/item/yweather:condition/@temp"/><xml-attribute java-attribute="currentCondition" name="channel/item/yweather:condition/@text"/><xml-element java-attribute="forecast" name="channel/item/yweather:forecast"/></java-attributes></java-type><java-type name="Forecast" xml-accessor-type="FIELD"><java-attributes><xml-attribute java-attribute="dayOfTheWeek" name="day"/><xml-attribute java-attribute="low"/><xml-attribute java-attribute="high"/><xml-attribute java-attribute="condition" name="text"/></java-attributes></java-type></java-types> </xml-bindings>演示版
以下演示代碼將讀取Yahoo氣象服務(wù)的XML數(shù)據(jù),并將對(duì)象編組回XML。 由于與未映射的CDATA部分有關(guān)的MOXy錯(cuò)誤(https://bugs.eclipse.org/357145),使用了經(jīng)過(guò)過(guò)濾的XMLStreamReader將其從XML輸入中刪除:
package blog.weather;import java.util.HashMap; import java.util.Map;import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import javax.xml.stream.StreamFilter; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamReader; import javax.xml.transform.stream.StreamSource;import org.eclipse.persistence.jaxb.JAXBContextFactory;public class YahooDemo {public static void main(String[] args) throws Exception {Map<String, Object> properties = new HashMap<String, Object>(1);properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "blog/weather/yahoo-binding.xml");JAXBContext jc = JAXBContext.newInstance(new Class[] {WeatherReport.class}, properties);XMLInputFactory xif = XMLInputFactory.newFactory();StreamSource xml = new StreamSource("http://weather.yahooapis.com/forecastrss?w=3369");XMLStreamReader xsr = xif.createXMLStreamReader(xml);xsr = xif.createFilteredReader(xsr, new CDATAFilter());Unmarshaller unmarshaller = jc.createUnmarshaller();WeatherReport weatherReport = (WeatherReport) unmarshaller.unmarshal(xsr);Marshaller marshaller = jc.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);marshaller.marshal(weatherReport, System.out);}private static class CDATAFilter implements StreamFilter {public boolean accept(XMLStreamReader xsr) {return XMLStreamReader.CDATA != xsr.getEventType();}}}輸出量
以下是運(yùn)行演示代碼的結(jié)果。 輸出代表我們映射到的XML文檔的一部分:
<?xml version="1.0" encoding="UTF-8"?> <rss xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0"><channel><yweather:location city="Ottawa"/><item><yweather:forecast day="Thu" low="57" high="74" text="Partly Cloudy"/><yweather:forecast day="Fri" low="53" high="79" text="Partly Cloudy"/></item></channel> </rss>參考: Java XML和JSON綁定博客上的 JCG合作伙伴 Blaise Doughan的參考:將 對(duì)象映射到多個(gè)XML模式-天氣示例 。
相關(guān)文章 :
- 使用JAXB從XSD生成XML
- 具有簡(jiǎn)單框架教程的Android XML綁定
- 使用XML Pull增強(qiáng)Android XML解析
- 使用Gson教程進(jìn)行Android JSON解析
- 用Jackson進(jìn)行Java JSON處理
- Java教程和Android教程列表
翻譯自: https://www.javacodegeeks.com/2011/09/mapping-objects-to-multiple-xml-schemas.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的将对象映射到多个XML模式–天气示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ddos防御多少钱(ddos防御多少)
- 下一篇: (linux的at)