JAXB
JAXB(JSR-222)提供了一种将对象转换为XML的简便方法.该标准有许多开源实现,包括:
> Metro JAXB(Java SE 6中包含的参考实现)
> EclipseLink JAXB (MOXy),我是技术主管
> Apache JaxMe
JAXB具有Java对象到XML的默认映射.可以通过应用注释来定制此映射.
import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.Element; @XmlRootElement public class Address { private String street; private String city; private String state; private String country; @XmlElement(name="postal-code") private String postalCode; }
将对应以下XML:
<address> <street>123 A Street</street> <city>Any Town</city> <state>A State</state> <postal-code>12345</postal-code> </address>
EclipseLink JAXB(MOXy)
MOXy有一个基于XPath的映射扩展.这意味着我们可以使用相同的Address类并将其映射到Google的地理编码格式:
import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import org.eclipse.persistence.oxm.annotations.XmlPath; @XmlRootElement(name="kml") @XmlType(propOrder={"country","state","city","street","postalCode"}) public class Address { @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:Thoroughfare/ns:ThoroughfareName/text()") private String street; @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:LocalityName/text()") private String city; @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:AdministrativeAreaName/text()") private String state; @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:CountryNameCode/text()") private String country; @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:PostalCode/ns:PostalCodeNumber/text()") private String postalCode; }
上面的类对应于以下XML:
<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://earth.google.com/kml/2.0" xmlns:ns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"> <Response> <Placemark> <ns:AddressDetails> <ns:Country> <ns:CountryNameCode>US</ns:CountryNameCode> <ns:AdministrativeArea> <ns:AdministrativeAreaName>CA</ns:AdministrativeAreaName> <ns:SubAdministrativeArea> <ns:Locality> <ns:LocalityName>Mountain View</ns:LocalityName> <ns:Thoroughfare> <ns:ThoroughfareName>1600 Amphitheatre Pkwy</ns:ThoroughfareName> </ns:Thoroughfare> <ns:PostalCode> <ns:PostalCodeNumber>94043</ns:PostalCodeNumber> </ns:PostalCode> </ns:Locality> </ns:SubAdministrativeArea> </ns:AdministrativeArea> </ns:Country> </ns:AddressDetails> </Placemark> </Response> </kml>
了解更多信息
> XPath Based Mapping – Geocode Example
> Map to Element based on an Attribute Value with EclipseLink JAXB (MOXy)
> XPath Based Mapping