我正在使用第三方Web服务,其定义和实现不受我的控制。 此Web服务将来会发生变化。
Web服务应该用于生成一个XML文件,其中包含一些与Web服务相同的数据(由相同的XSD类型表示)以及程序生成的一些额外信息。
我的方法:
我将在我自己的XSD文件中使用的XSD类型,但是在WSDL中定义,可能会发生变化。每当它们发生变化时,我想再次自动处理XSD和WSDL数据绑定。 (如果变化足够大,这可能会触发一些开发工作。(但通常不会。)
我的问题:
在步骤1中,我需要一个XSD,指的是Web服务使用的相同类型。
WSDL指的是另一个WSDL,它指的是另一个WSDL等。最终,有一个带有所需内联XSD类型的WSDL。据我所知,没有办法从XSD直接引用WSDL的内联XSD类型。
我认为最可行的方法是在自动处理(数据绑定之前)中包含一个额外步骤,该步骤将内联XSD从WSDL提取到其他XSD文件中。然后可以通过我自己的XSD文件引用这些其他XSD文件。
我想避免的事情:
答案 0 :(得分:3)
我不知道任何库会为你做这件事,但绝对可以通过一点努力(约200行)来实现。一个粗略的元程序,用于生成所有内联和包含的XSD:
method processWSDL(Document wsdl) {
for each ("/wsdl:definitions/wsdl:types/xsd:schema" in wsdl) {
call processXSD("inline_[i].xsd",".")
}
for each ("/wsdl:definitions/wsdl:import" in wsdl) {
Document x = read and parse ("@location")
if (x is WSDL) call processWSDL(x)
else if (x is XSD) call processXSD("@location", x)
}
}
method processXSD(String filename, Document xsd) {
write "xsd" to a new file "filename" // if 'filename' is a URL, take only the part after the last '/'
for each ("/xsd:schema/xsd:import" or "/xsd:schema/xsd:include" in xsd) {
if ("@schemaLocation" is local reference) { // no 'http://' prefix
Document x = read and parse ("@schemaLocation")
call processXSD("@schemaLocation", x)
}
}
}
这不是一个完整的解决方案,例如不处理在内联架构之外定义的名称空间前缀,但希望给出一个很好的起点。
答案 1 :(得分:2)
为了保持这篇文章的相关性,自收到答案以来,情况发生了变化。现在可以在Java中从WSDL生成您想要的内容; JAX-WS提供了 wsimport 工具,它完全按照要求执行:获取WSDL,创建一个客户端代理以及一组用于注释的JAXB注释类/编组请求。
我想说,对于@MoizTankiwala来说,从WSDL导出XSD内容(或者在WSDL的类型部分中包含所有外部XSD内容)的需求是充满活力的。
当有人拥有大量XSD时,前者是有意义的,并且人们普遍担心在XSD中有效管理,分析和发展该模型。
后者也受到追捧,因为当涉及到WSDL到客户端代理生成时,一些(主要)动态语言仍然缺乏工具的全面支持。
我的other answer on SO谈到类似的需求,至少应该对Moiz的请求有帮助......