1

次のコードを実行しようとしています:

<?php
$xml = <<<EOD
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                  xmlns="urn:enterprise.soap.sforce.com"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <loginResponse>
            <result>
                <metadataServerUrl>
                    https://na3.salesforce.com/services/Soap/m/28.0/00D50000000IdrE
                </metadataServerUrl>
                <passwordExpired>false</passwordExpired>
                <sandbox>false</sandbox>
                <serverUrl>
                    https://abc.com/services/Soap/c/28.0/00D50000000IdrE
                </serverUrl>
                <sessionId>
                    00D50000000IdrE!AREAQK4VYXRaHoL_uRvOi.QXXw3ahAt2Cge254wygiW7cr_f6DVa2pDC6g57w5IE
                    fidAu3ZRsJFBN5Bwb6DVhF18zKFiVVyT
                </sessionId>
                <userId>00550000001Dd4uAAC</userId>
                <userInfo>
                    <accessibilityMode>false</accessibilityMode>
                    <currencySymbol>$</currencySymbol>
                    <orgAttachmentFileSizeLimit>5242880
                    </orgAttachmentFileSizeLimit>
                    <orgDefaultCurrencyIsoCode>USD</orgDefaultCurrencyIsoCode>
                    <orgDisallowHtmlAttachments>false
                    </orgDisallowHtmlAttachments>
                    <orgHasPersonAccounts>false</orgHasPersonAccounts>
                    <organizationId>00D50000000IdrEEAS</organizationId>
                    <organizationMultiCurrency>false</organizationMultiCurrency>
                    <organizationName>3CLogic</organizationName>
                    <profileId>00e500000017al5AAA</profileId>
                    <roleId xsi:nil="true"/>
                    <sessionSecondsValid>7200</sessionSecondsValid>
                    <userDefaultCurrencyIsoCode xsi:nil="true"/>
                    <userEmail>ramana@3clogic.com</userEmail>
                    <userFullName>Ramana</userFullName>
                    <userId>00550Dd4uAAC</userId>
                    <userLanguage>en_US</userLanguage>
                    <userLocale>en_US</userLocale>
                    <userName>raman@gmail.com.com</userName>
                    <userTimeZone>America/New_York</userTimeZone>
                    <userType>Standard</userType>
                    <userUiSkin>Theme3</userUiSkin>
                </userInfo>
            </result>
        </loginResponse>
    </soapenv:Body>
</soapenv:Envelope>
EOD;
$sxe = new SimpleXMLElement($xml);
$sxe->registerXPathNamespace('env', 'http://schemas.xmlsoap.org/soap/envelope/ ');
$sxe->registerXPathNamespace('def', 'urn:enterprise.soap.sforce.com');
$result = $sxe->xpath('/env:Envelope/env:Body/def:loginResponse/def:result/def:serverUrl');
?>

ただし、次のエラーが発生します。

Call to undefined method SimpleXMLElement::registerXPathNamespace() 

PHPバージョン5.0.5を使用しています。ただし、php バージョン 5.1.0 および 5.5.3 では、このエラーが発生しますが、出力もありません。XMLタグ「serverUrl」の値を抽出しようとしています。助けてください。可能であれば、php 5.0.5 の解決策を提案してください

4

1 に答える 1

0

XPath 機能は、PHP 5.2.0 で SimpleXML に追加されただけです (それ自体は「サポート終了」から 2 年半以上経過しています)。 、別の解決策を考え出す必要があります。

幸いなことに、この XPath 式は名前空間の使用以外は非常に基本的なものであり、この->children()メソッドは PHP 5.0.1 以降、名前空間を処理することができました。

したがって、このコードはそれ以降、どのバージョンの PHP でも問題なく動作するはずです。

$sxe = new SimpleXMLElement($xml);

// Define some short identifiers for namespaces without relying on their prefix in the XML
define('NS_ENV', 'http://schemas.xmlsoap.org/soap/envelope/');
define('NS_SFORCE', 'urn:enterprise.soap.sforce.com');

// $sxe already represents the soapenv:Envelope node, so we don't need to mention that
$result = $sxe
    ->children(NS_ENV)->Body
    ->children(NS_SFORCE)->loginResponse->result->serverUrl;

// $result is now the SimpleXML object for the `serverUrl` node(s)
// (unlike with ->xpath(), which returns a plain PHP array of "search results")
echo trim($result);

これは、さまざまなバージョンの PHP で評価されたライブ サンプルです。

于 2013-09-01T20:20:44.627 に答える