如何在带有导入的XML上使用XPath?

问题描述 投票:1回答:1

我正在尝试解析WSDL文件以构建PHP类。尽管有很多工具可以解决这些问题,但是它们目前都无法记录用于请求和/或响应的可用SOAPHeader和SOAPFaults。

我对构建此https://github.com/rquadling/wsdl2php已有足够的了解。但是后来我遇到了与我以前的知识不符的服务。

所以一个示例WSDL文件(仅作为登录方法和一些导入)。

<?xml version="1.0" encoding="UTF-8"?>
<definitions
        xmlns:tns="urn:platform_2012_2.webservices.netsuite.com"
        xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
        xmlns="http://schemas.xmlsoap.org/wsdl/"
        xmlns:platformMsgs="urn:messages_2012_2.platform.webservices.netsuite.com"
        xmlns:platformFaults="urn:faults_2012_2.platform.webservices.netsuite.com"
        targetNamespace="urn:platform_2012_2.webservices.netsuite.com">
    <types>
        <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
            <xsd:import namespace="urn:core_2012_2.platform.webservices.netsuite.com" schemaLocation="https://webservices.eu2.netsuite.com/xsd/platform/v2012_2_0/core.xsd"/>
            <xsd:import namespace="urn:faults_2012_2.platform.webservices.netsuite.com" schemaLocation="https://webservices.eu2.netsuite.com/xsd/platform/v2012_2_0/faults.xsd"/>
            <xsd:import namespace="urn:messages_2012_2.platform.webservices.netsuite.com" schemaLocation="https://webservices.eu2.netsuite.com/xsd/platform/v2012_2_0/messages.xsd"/>
            <xsd:import namespace="urn:common_2012_2.platform.webservices.netsuite.com" schemaLocation="https://webservices.eu2.netsuite.com/xsd/platform/v2012_2_0/common.xsd"/>
            <!-- snip -->
        </xsd:schema>
    </types>
    <message name="headers">
        <part name="applicationInfo" element="platformMsgs:applicationInfo"/>
        <part name="partnerInfo" element="platformMsgs:partnerInfo"/>
        <part name="documentInfo" element="platformMsgs:documentInfo"/>
        <part name="preferences" element="platformMsgs:preferences"/>
        <part name="searchPreferences" element="platformMsgs:searchPreferences"/>
        <part name="passport" element="platformMsgs:passport"/>
    </message>
    <message name="loginRequest">
        <part name="parameters" element="platformMsgs:login"/>
    </message>
    <message name="loginResponse">
        <part name="parameters" element="platformMsgs:loginResponse"/>
    </message>
    <!-- snip -->
    <portType name="NetSuitePortType">
        <operation name="login">
            <input name="loginRequest" message="tns:loginRequest"/>
            <output name="loginResponse" message="tns:loginResponse"/>
            <fault name="InsufficientPermissionFault" message="tns:InsufficientPermissionFault"/>
            <fault name="InvalidAccountFault" message="tns:InvalidAccountFault"/>
            <fault name="InvalidCredentialsFault" message="tns:InvalidCredentialsFault"/>
            <fault name="InvalidVersionFault" message="tns:InvalidVersionFault"/>
            <fault name="ExceededRequestLimitFault" message="tns:ExceededRequestLimitFault"/>
            <fault name="UnexpectedErrorFault" message="tns:UnexpectedErrorFault"/>
        </operation>
        <!-- snip -->
    </portType>
    <binding name="NetSuiteBinding" type="tns:NetSuitePortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="login">
            <soap:operation soapAction="login"/>
            <input name="loginRequest">
                <soap:header message="tns:headers" part="applicationInfo" use="literal"/>
                <soap:header message="tns:headers" part="partnerInfo" use="literal"/>
                <soap:body use="literal"/>
            </input>
            <output name="loginResponse">
                <soap:body use="literal"/>
            </output>
            <fault name="InsufficientPermissionFault">
                <soap:fault name="InsufficientPermissionFault" use="literal"/>
            </fault>
            <fault name="InvalidAccountFault">
                <soap:fault name="InvalidAccountFault" use="literal"/>
            </fault>
            <fault name="InvalidCredentialsFault">
                <soap:fault name="InvalidCredentialsFault" use="literal"/>
            </fault>
            <fault name="InvalidVersionFault">
                <soap:fault name="InvalidVersionFault" use="literal"/>
            </fault>
            <fault name="ExceededRequestLimitFault">
                <soap:fault name="ExceededRequestLimitFault" use="literal"/>
            </fault>
            <fault name="UnexpectedErrorFault">
                <soap:fault name="UnexpectedErrorFault" use="literal"/>
            </fault>
        </operation>
        <!-- snip -->
    </binding>
    <service name="NetSuiteService">
        <port name="NetSuitePort" binding="tns:NetSuiteBinding">
            <soap:address location="https://webservices.eu2.netsuite.com/services/NetSuitePort_2012_2"/>
        </port>
    </service>
</definitions>

我正在使用XPath提取标题(输入和输出)和错误...

    $xPathMaster['Headers'] = [
        'headers_in' => [
            'Definitions/Binding/Operation[method]/Input/Header' => '//*[local-name()="definitions"]/*[local-name()="binding"]/*[local-name()="operation"][@name="'.$call.'"]/*[local-name()="input"]/*[local-name()="header"]/@part',
        ],
        'headers_out' => [
            'Definitions/Binding/Operation[method]/Output/Header' => '//*[local-name()="definitions"]/*[local-name()="binding"]/*[local-name()="operation"][@name="'.$call.'"]/*[local-name()="output"]/*[local-name()="header"]/@part',
        ],
        'faults' => [
            'Definitions/Binding/Operation[method]/fault' => '//*[local-name()="definitions"]/*[local-name()="binding"]/*[local-name()="operation"][@name="'.$call.'"]/*[local-name()="fault"]/@name',
        ],
    ];

([$call是要调用的方法的名称。)>

所以我的工具知道标题applicationInfologinResponse相关联。

我不确定该怎么做是以编程方式找到该类型的结构。

手动,我知道它以映射类型存在于从https://webservices.eu2.netsuite.com/xsd/platform/v2012_2_0/messages.xsd ...导入的消息命名空间中>

<!-- snip -->
<complexType name="ApplicationInfo">
  <sequence>
    <element name="applicationId" minOccurs="0" type="xsd:string"/>
  </sequence>
</complexType>
<element name="applicationInfo" type="platformMsgs:ApplicationInfo"/>

我正在使用PHP的SOAP技术,它能够为我提供类型列表($client->__getTypes(),但这将结构显示为...

struct ApplicationInfo {
 string applicationId;
}

((因此它必须在内部运行导入),但不提及applicationInfo

因此,尝试使用XPath查询通过PHP的DOM做到这一点,而我迷失了如何“扩展”导入,以便显示实际的内容,而不是引用。

我有点迷路。

我正在尝试解析WSDL文件以构建PHP类。尽管有很多工具可以解决这些问题,但是它们目前都无法记录现有的可用SOAPHeader和SOAPFaults ...

php xml dom xpath soap
1个回答
0
投票

我根本不是PHP专家,但是我认为PHP SOAP技术做得很好。 XSD中的类型列表(XSD类型定义

)不应包含applicationInfo,因为applicationInfo是XSD元素声明
© www.soinside.com 2019 - 2024. All rights reserved.