你如何使用wsdl2java与无效的wsdl文件?

时间:2014-06-10 10:49:16

标签: cxf msdn wsdl2java

我正在尝试使用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。看来它已经很长时间了。

2 个答案:

答案 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服务。

感谢不安宁的建议,但我不知道如何下载所依赖的所有资源。