用xstream解析谷歌地理编码

我正在使用Java和XStream通过http解析谷歌地理编码请求。 我的想法是拥有一个带有所有地理编码attr的地址类(即lat / long,city,provice / state等),但是我在使用xstream解析xml时遇到了问题。

谷歌的回复与此类似:

  98 St. Patrick St, Toronto  200 geocode   
98 St Patrick St, Toronto, ON, Canada
CACanadaONToronto98 St Patrick StM5T -79.3896388,43.6528902,0

这并没有很好地显示,但代码的内容在AddressDetails标签中。

无论如何,我是Java和XStream的新手,所以API术语对我来说有点混乱。 我只需要能够编写一些映射器,将所有这些标记(即CountryName)映射到我的Address对象中的属性,(即。address.country = blah)地址对象将非常简单,主要是国家的字符串名称等,并为lat / long浮动。

文档和示例只显示直接映射,其中每个xml标记直接映射到对象的同名属性。 然而,在我的情况下,标签的名称与对象attr的不同。 我正在寻找正确方向的快速点。

我在几个项目中使用过XStream。 不幸的是,你的问题并不是XStream旨在解决的问题。 您可以使用其转换器机制来实现您的直接目标,但您将遇到限制。 简而言之,XStream不是为了将树结构A转换为树结构B而设计的 – 它的目的是将Java域模型转换为一些合理的XML。 当您不太关心所生成的XML的细节时,XStream是一个很好的工具。 如果您更关心XML而不是Java对象,请查看XMLBeans – Java很难看,但它非常符合模式。

对于您的项目,我将通过XML bean运行Google XML模式,生成一些Java,这将为您提供一种更有文化的手动编码转换器的方法。 您可以使用原始DOM树,但是您的代码类似于myAddress.setStreet(root.getFirstChild()。getAttribute(“addr1”)))。 对于XML bean,你会说像myAddress.setStreet(googleResult.getAddress()。getStreetName();

我忽略了JAXB,因为它试图将接口与实现分开会增加不必要的复杂性。 Castor可能也是一个很好的考虑工具,但我多年没有使用过它。

简而言之,没有很多好的Object-to-Object或XML-to-Object转换器可以很好地处理结构转换。 在那些我已经看过尝试声明性解决方案的人中,所有这些解决方案似乎都比使用XStream / XmlBeans以及手工编码的结构转换更加复杂(并且不再可维护)。

是否可以定义一个专门用于处理XStream映射的单独类? 然后,您可以通过查询此其他对象的值来简单地填充您的AddressDetails对象。

我最终只是使用xpath并手动填充我自己的地址对象。 似乎工作正常。

你试过json格式吗? 它应该是相同的,但你需要设置一个com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver作为XStream的驱动程序

您可以使用EclipseLink JAXB(MOXy)来执行此操作:

 package com.example; import javax.xml.bind.annotation.XmlRootElement; import org.eclipse.persistence.oxm.annotations.XmlPath; @XmlRootElement(name="kml") public class Address { private String country; @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:CountryName/text()") public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } } 

 @javax.xml.bind.annotation.XmlSchema( namespace = "http://earth.google.com/kml/2.0", xmlns = { @javax.xml.bind.annotation.XmlNs( prefix = "ns", namespaceURI ="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0") }, elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) package com.example; 

这里有一个完整的例子: