0

何らかの理由で解析エラーが発生しています。私はそれを「何」に絞り込みましたが、「なぜ」には絞り込みませんでした。

これが私のテストスクリプトです:

<?php
$xml_string = '<?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <AccountsGetXMLResponse xmlns="https://test.testsite.com/v3.0/">
            <AccountsGetXMLResult>
            <AccountsWSDS xmlns="">
                <CUSACCOUNTS><ACCOUNT_ID>6036335098370413</ACCOUNT_ID><ACTIVE_FLAG>N</ACTIVE_FLAG><IN_USE>Y</IN_USE><ACCOUNT_BALANCE>0</ACCOUNT_BALANCE></CUSACCOUNTS>
                <CUSACCOUNTS><ACCOUNT_ID>6036335098370414</ACCOUNT_ID><ACTIVE_FLAG>N</ACTIVE_FLAG><IN_USE>Y</IN_USE><ACCOUNT_BALANCE>0</ACCOUNT_BALANCE></CUSACCOUNTS>
                <META_INFO><INFO_CLASS>TableInfo</INFO_CLASS><INFO_TYPE>Accounts</INFO_TYPE><INFO_CODE>PageSize</INFO_CODE><VALUE>10</VALUE></META_INFO>
                <META_INFO><INFO_CLASS>TableInfo</INFO_CLASS><INFO_TYPE>Accounts</INFO_TYPE><INFO_CODE>PageNumber</INFO_CODE><VALUE>1</VALUE></META_INFO>
                <META_INFO><INFO_CLASS>TableInfo</INFO_CLASS><INFO_TYPE>Accounts</INFO_TYPE><INFO_CODE>RowCount</INFO_CODE><VALUE>200</VALUE></META_INFO>
                <META_INFO><INFO_CLASS>TableInfo</INFO_CLASS><INFO_TYPE>Accounts</INFO_TYPE><INFO_CODE>PageCount</INFO_CODE><VALUE>20</VALUE></META_INFO>
            </AccountsWSDS>
            </AccountsGetXMLResult>
            <rowCount>200</rowCount>
            <pageCount>20</pageCount>
        </AccountsGetXMLResponse>
    </soap:Body>
</soap:Envelope>'; 

if( ! $xml = simplexml_load_string( $xml_string ) ) 
{ 
    echo "Unable to load XML string"; 
} 
else 
{ 
    echo "XML String loaded successfully"; 
}
?>

上記の xml 文字列をテストすると、「Unable.....」という状態になります。しかし、「」を取り出すとうまくいきます!明らかに simplexml_load_string() にはいくつかの詳細があります。しかし、私はこの応答を で受け取りました。最初に検索/置換スクリプトを実行する必要はありません。

また、私はこれを正しく行っていますか?最後に、CUSACCOUNTS の解析を開始し、内部のデータを抽出する必要があります。

4

1 に答える 1

0

以前にSimpleXMLとsoapを扱ったことがありますが、 XMLReaderクラスを使用する方がはるかに簡単で、取得したデータの中身(CUSACCOUNTSのものなど)をSimpleXMLオブジェクトに変換できることがわかりました。

あなたの場合に私がしたことは次のとおりです。

$xml_string = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <AccountsGetXMLResponse xmlns="https://test.testsite.com/v3.0/">
            <AccountsGetXMLResult>
            <AccountsWSDS xmlns="">
                <CUSACCOUNTS><ACCOUNT_ID>6036335098370413</ACCOUNT_ID><ACTIVE_FLAG>N</ACTIVE_FLAG><IN_USE>Y</IN_USE><ACCOUNT_BALANCE>0</ACCOUNT_BALANCE></CUSACCOUNTS>
                <CUSACCOUNTS><ACCOUNT_ID>6036335098370414</ACCOUNT_ID><ACTIVE_FLAG>N</ACTIVE_FLAG><IN_USE>Y</IN_USE><ACCOUNT_BALANCE>0</ACCOUNT_BALANCE></CUSACCOUNTS>
                <META_INFO><INFO_CLASS>TableInfo</INFO_CLASS><INFO_TYPE>Accounts</INFO_TYPE><INFO_CODE>PageSize</INFO_CODE><VALUE>10</VALUE></META_INFO>
                <META_INFO><INFO_CLASS>TableInfo</INFO_CLASS><INFO_TYPE>Accounts</INFO_TYPE><INFO_CODE>PageNumber</INFO_CODE><VALUE>1</VALUE></META_INFO>
                <META_INFO><INFO_CLASS>TableInfo</INFO_CLASS><INFO_TYPE>Accounts</INFO_TYPE><INFO_CODE>RowCount</INFO_CODE><VALUE>200</VALUE></META_INFO>
                <META_INFO><INFO_CLASS>TableInfo</INFO_CLASS><INFO_TYPE>Accounts</INFO_TYPE><INFO_CODE>PageCount</INFO_CODE><VALUE>20</VALUE></META_INFO>
            </AccountsWSDS>
            </AccountsGetXMLResult>
            <rowCount>200</rowCount>
            <pageCount>20</pageCount>
        </AccountsGetXMLResponse>
    </soap:Body>
</soap:Envelope>
XML;

$xml = new XmlReader();
$xml->xml($xml_string);
while($xml->read()){
  // if the current item is an open tag AND matches the account response, grab it's xml
  if ($xml->nodeType == XMLReader::ELEMENT && $xml->name == "AccountsGetXMLResponse") {
    // BAM! readOuterXML yanks the xml string out (including the element we matched)
    // so that we can convert it into a simplexml object for easy iterating
    $xml_obj = new SimpleXMLElement($xml->readOuterXML());
    break;
  }
}

// now we can iterate through it hooray!
foreach($xml_obj->AccountsGetXMLResult->AccountsWSDS->CUSACCOUNTS as $cusaccount){
  // I convert to array and print here but you can do w/e you want now
  print_r((array)$cusaccount);
}

そして、私は得ました:

Array
(
    [ACCOUNT_ID] => 6036335098370413
    [ACTIVE_FLAG] => N
    [IN_USE] => Y
    [ACCOUNT_BALANCE] => 0
)
Array
(
    [ACCOUNT_ID] => 6036335098370414
    [ACTIVE_FLAG] => N
    [IN_USE] => Y
    [ACCOUNT_BALANCE] => 0
)
于 2012-05-24T18:15:03.080 に答える