目前我们的软件通过 XML/SOAP 与远程网络服务交互。我们使用 XSD 来方便地创建要发送到远程系统的请求。很好,而且效果很好。 XSD 非常棒。
但是,它确实会导致用于创建 Document 对象的代码块非常冗长。我想知道是否有人对处理这些用于创建请求和处理响应文档的大型代码块的良好设计实践有建议。
XSD 文档对象的要点是将 XML 创建与客户端分离。但是,我认为外观类对于每项服务来说可能是个好主意。我认为这对于创建非常有用,因为可以为外观类提供构建请求文档和发送请求的成分,而无需将客户端耦合到 XSD 类。我认为响应文档中出现了问题。如果存在多级响应,您将最终创建 POJO 类来包装 XSD 类,这看起来有点过头了。
最佳答案
注意:我是 EclipseLink JAXB (MOXy) 技术主管。
MOXy 是一个 JAXB ( JSR-222 ) 实现,具有基于 XPath 的映射扩展。这意味着您可以将更紧凑的对象模型映射到您的 XML。在下面的示例中,一个简单的地址对象映射到 Google's Geocoding V2。格式:
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>
了解更多信息
关于java - Java 中的 XSD 设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5779696/