Predic8 WSDL解析器读取XSD的<include>语句后停止运行求助
解决Predic8 WSDL解析器处理
<include>时的中断问题 我之前也踩过Predic8 WSDL解析器的这个坑!当<types>段里包含<include>引用外部XSD时,解析器居然会中途停止工作,把<types>移到WSDL末尾就正常运行——这明显是解析器对节点顺序的处理有bug。下面是我总结的几个可行解决方案:
方案1:调整WSDL节点顺序(最快见效)
既然你已经发现把<types>放在WSDL文档末尾能正常运行,那可以直接采用这个方法:
- 将
<wsdl:types>段移到整个WSDL的最后位置,确保它在<wsdl:service>、<wsdl:port>等所有核心节点之后。 - 这样Predic8解析器会先加载完WSDL的整体结构,再处理
<include>引用的XSD内容,就不会出现中断了。
方案2:手动预处理XSD Include
如果因为业务限制不能调整WSDL结构,可以提前把<include>引用的XSD内容合并到主WSDL中,再交给解析器处理。这里给你一段Java示例代码:
import com.predic8.wsdl.Definitions; import com.predic8.wsdl.WSDLParser; import java.io.ByteArrayInputStream; import java.nio.file.Files; import java.nio.file.Paths; import java.util.regex.Matcher; import java.util.regex.Pattern; public class WSDLIncludeProcessor { public static void main(String[] args) throws Exception { // 读取原始WSDL文件 String wsdlPath = "path/to/your.wsdl"; String wsdlContent = Files.readString(Paths.get(wsdlPath)); // 匹配并替换<xs:include>标签 Pattern includePattern = Pattern.compile("<xs:include schemaLocation=\"([^\"]+)\"/>"); Matcher matcher = includePattern.matcher(wsdlContent); StringBuffer processedContent = new StringBuffer(); while (matcher.find()) { String xsdFilePath = matcher.group(1); // 读取引用的XSD文件内容 String xsdContent = Files.readString(Paths.get(xsdFilePath)); // 移除XSD的根schema标签,只保留内部类型定义 xsdContent = xsdContent.replaceFirst("<xs:schema[^>]*>", "") .replaceFirst("</xs:schema>", ""); // 替换include标签为实际XSD内容 matcher.appendReplacement(processedContent, xsdContent); } String finalWsdl = matcher.appendTail(processedContent).toString(); // 使用Predic8解析处理后的WSDL WSDLParser parser = new WSDLParser(); Definitions definitions = parser.parse(new ByteArrayInputStream(finalWsdl.getBytes())); // 后续操作... System.out.println("WSDL解析成功:" + definitions.getName()); } }
注意:如果引用的XSD有命名空间声明,预处理时要确保和主WSDL的命名空间兼容,避免冲突。
方案3:升级Predic8库版本
这个问题大概率是旧版本解析器的bug,你可以尝试升级到最新版的Predic8 WSDL解析库。在Maven中可以这样更新依赖:
<dependency> <groupId>com.predic8</groupId> <artifactId>wsdl-parser</artifactId> <version>1.1.62</version> <!-- 替换为最新稳定版 --> </dependency>
升级后再测试解析带<include>的WSDL,说不定官方已经修复了这个节点顺序敏感的问题。
内容的提问来源于stack exchange,提问作者Adder
相关产品推荐
相关产品推荐

