【问题标题】:PHP SOAP: attribute already defined in WSDL-filePHP SOAP:已在 WSDL 文件中定义的属性
【发布时间】:2012-10-23 12:49:02
【问题描述】:

我正在使用一个 wsdl 文件,它与 SoapUI 一起工作,但不与 PHP Soap 一起工作

代码:

<?php
$WSDL     = new SoapClient('Foo/bar.wsdl');
?>

堆栈跟踪:

致命错误:未捕获的 SoapFault 异常:[WSDL] SOAP-ERROR: Parsing 架构:属性 'http://url.com/LGW/2009/:unitOfMeasure' 已经定义 在 Foo.php:2 堆栈跟踪:#0 Foo.php(2): SoapClient->SoapClient('Foo/bar.wsdl', Array) #1 {main} 抛出 foo.php上线 2

任何人都知道 PHP-SOAP 库试图告诉我什么。 WSDL 文件应该是有效的(至少 PEAR SOAP 和 SoapUI 都可以正常工作)。

WSDL 包含几个 &lt;s:attribute ref="tns:unitOfMeasure"/&gt; -lines 所以我猜它指的是那些,但真的不明白如何解决这个问题......

【问题讨论】:

  • 我认为很清楚,该属性已经定义。它甚至会告诉你在哪里。
  • 我知道,但为什么会出现这个问题?相同的文件使用 PEAR::SOAP 和 SoapUI 验证 Ok
  • 这个解决了。 WSDL 毕竟是无效的。 WSDL 通知生成多个相同的命名空间属性。一些 SOAP 库似乎将其验证为良好的 XML。 PHP 没有
  • @sarte:请将解决方案发布为您自己问题的答案,并尽可能接受。

标签: php attributes wsdl defined


【解决方案1】:

WSDL 文件有错误的指令,建议遵循 XML

<ns:foo unitOfMeasure="foo" ns:unitOfMeasure="invalid">
  <ns:bar unitOfMeasure="foo" ns:unitOfMeasure="invalid"></ns:bar>
</ns:foo>

这给出了已经定义的错误。由于命名空间声明,ns:unitOfMeasure 属性被认为是唯一的,并且不能重新定义。

我从 WSDL 文件中删除了这些行,之后一切正常。

显然 Java、PEAR 和可能的 .NET SOAP 库将接受这种指令,尽管它们在 SOAP/WSDL 消息中无效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    相关资源
    最近更新 更多