我正在尝试使用MSDN' MTPS来访问其MSDN内容。如果我只是将wsdl2java的url传递给他们的wsdl,我会得到一个NPE(CXF-5793)。 Daniel Kulp发现这是因为他们有一个名为" messsage"的属性。还有一个额外的" s"。
很酷..所以我使用xslt搜索renaming an attribute,我想出了这个:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="@messsage">
<xsl:attribute name="message">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
事实证明,我不能将wsdl2java指向本地文件,因为我尝试使用的wsdl有一堆&lt; xsd:import&gt;指令。所以我制作了脚本来下载这些文件。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">
<xsl:output method="html" doctype-system="about:legacy-compat" />
<xsl:template match="/">
<html>
<head>
<title>XSD Imports for Wget to Fetch</title>
</head>
<body>
<div>This file is generated so that wget -i can download xsdimport'ed files.</div>
<xsl:for-each select="//xs:import">
<a>
<xsl:attribute name="href">
<xsl:value-of select="@schemaLocation" />
</xsl:attribute>
<xsl:value-of select="@schemaLocation" />
</a>
<br />
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
#!/bin/sh
wget -xNS http://services.msdn.microsoft.com/ContentServices/ContentService.asmx\?wsdl
xsltproc -o services.msdn.microsoft.com/ContentServices/fixedwsdl.xml messsage.xsl services.msdn.microsoft.com/ContentServices/ContentService.asmx\?wsdl
xsltproc -o wget.html wget.xsl services.msdn.microsoft.com/ContentServices/ContentService.asmx\?wsdl
wget -xNSF -i wget.html -B http://services.msdn.microsoft.com/ContentServices/ContentService.asmx\?wsdl
for filename in services.msdn.microsoft.com/ContentServices/schemas/*.xsd; do
xsltproc -o "$filename.html" wget.xsl $filename
wget -xNSF -i "$filename.html" -B http://services.msdn.microsoft.com/ContentServices/schemas/
done
for filename in services.msdn.microsoft.com/ContentServices/schemas/*.xsd; do
xsltproc -o "$filename.html" wget.xsl $filename
wget -xNSF -i "$filename.html" -B http://services.msdn.microsoft.com/ContentServices/schemas/
done
虽然它没有用。我猜它错过了其中一些,而wsdl2java似乎想在当前的工作目录中找到那些脚本。我不知道。
我的问题是,有没有办法让wsdl2java在使用之前将xml转换应用于wsdl文件?如果没有,我应该继续沿着这条路使用wget和东西来下载wsdl所依赖的文件吗?我可能会调查&#34;展平&#34;接下来是wsdl文件,但有些人说&lt; xsd:import&gt; s不能像&lt; xsd:include&gt;那样展平。我觉得微软很难说服他们修复wsdl。看来它已经很长时间了。
答案 0 :(得分:2)
我倾向于继续沿着获取所有引用模式的道路前进。我已经使用SoapUI来处理其他麻烦的WSDL。在我正在使用的(相当旧的)版本3.6.1中,有一个“导出定义”的功能,它应该下载所有引用的模式。首先在SoapUI中加载修正后的WSDL。
答案 1 :(得分:0)
所以..我做的是将此代理添加到我的maven设置中。 (我正在使用maven插件生成这些类。)
<proxies>
<proxy>
<active>true</active>
<protocol>http</protocol>
<host>localhost</host>
<port>8080</port>
</proxy>
</proxies>
然后我跑了
mitmproxy-2.7 --replace /~s/messsage/message
现在有效。谈谈一个平台依赖于平台的构建......
现在去学习如何使用Web服务。
感谢不安宁的建议,但我不知道如何下载所依赖的所有资源。