java - Java 中的 XSD 设计问题

标签 java xml soap xsd

目前我们的软件通过 XML/SOAP 与远程网络服务交互。我们使用 XSD 来方便地创建要发送到远程系统的请求。很好,而且效果很好。 XSD 非常棒。

但是,它确实会导致用于创建 Document 对象的代码块非常冗长。我想知道是否有人对处理这些用于创建请求和处理响应文档的大型代码块的良好设计实践有建议。

XSD 文档对象的要点是将 XML 创建与客户端分离。但是,我认为外观类对于每项服务来说可能是个好主意。我认为这对于创建非常有用,因为可以为外观类提供构建请求文档和发送请求的成分,而无需将客户端耦合到 XSD 类。我认为响应文档中出现了问题。如果存在多级响应,您将最终创建 POJO 类来包装 XSD 类,这看起来有点过头了。

最佳答案

注意:我是 EclipseLink JAXB (MOXy) 技术主管。

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/

相关文章:

c# - 在 .NET 中使用 RPC/编码的 SOAP Web 服务时出错

java 序列化 - 持久化类定义

java - @OneToMany 中不必要的更新

java - NullPointerException @一对一映射

java - 检查特定的数组索引是否存在

java - FSET服务。无法实现web服务,soap客户端

python - 使用 suds 时如何检查 python 中的 SOAP 错误?

iphone - 从 XML 文件解析的分段 UITableview(需要帮助构建 XML 文件)

xml - 清除子处理程序中的 XML Twig

c# - 将 HttpResponseMessage 转换为 XML 对象