1

xml2array パーサーを含む多くのビルド済みパーサーを試しましたが、うまくいきませんでした。私も自分で試してみましたが、成功しませんでした。私は simplexmlelement/xpath と同じ結果でさまざまな方法を試しました。そのため、キーボードで頭を叩いている場所にいます。

基本的に、API呼び出しが私に吐き出しているコードを解析しようとしています。SOAP 呼び出しを行って、curl (https) 経由で xml コンテンツを取得しています。

以下は、返された xml の例です: HTTP/1.1 100 続行

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
X-Powered-By: Servlet 2.5; JBoss-5.0/JBossWeb-2.1
Content-Type: text/xml;charset=UTF-8
Transfer-Encoding: chunked
Date: Sat, 21 Apr 2012 19:49:30 GMT


<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>
    <env:Header></env:Header>
    <env:Body>
        <ns:processRequestResponse xmlns:ns='hidden.address'>
            <result>
                <?xml version="1.0" encoding="UTF-8"?>
                    <CRMMessage language="en_US" currency="USD" isTrustedSAT="false" hostversion="hiddenINT">
                        <RequestCode>HiddenMethoForCall</RequestCode>
                        <ResponseCode>A</ResponseCode>
                        <ResultSet>
                            <ResultSetMetaData>
                                <RSColumn name="FirstName" type="string" nullable="true"></RSColumn>
                                <RSColumn name="LastName" type="string" nullable="true"></RSColumn>
                                <RSColumn name="EmailAddress" type="string" nullable="true"></RSColumn>
                            </ResultSetMetaData>
                            <Rows>
                                <Row id="hiddenINT">
                                    <Col>John</Col>
                                    <Col>Doe</Col>
                                    <Col>john@doe.com</Col>
                                </Row>
                            </Rows>
                        </ResultSet>
                    </CRMMessage>

            </result>
        </ns:processRequestResponse>
    </env:Body>
</env:Envelope>

xml2array を使用してみましたが、同じレベルで同じ名前のキーの解析をサポートしていないと明示的に述べています。

提案されたパーサーを受け入れるので、それが問題になるかどうかはわかりませんが、ここにまとめたものがあります(これは、リクエストが行われた後にリクエストを処理するクラス内にあります):

$retVal = curl_exec($soap_do);  

if($retVal === false) {
    $err = 'Curl error: ' . curl_error($soap_do);  
    throw new requestManager($err);
} else {
    $string = strstr($retVal, '<');
        // $aResp = simplexml_load_string($string);


    if(!function_exists('xml_parser_create')) { 
        //print "'xml_parser_create()' function not found!"; 
        return array(); 
    } 
    curl_close($soap_do);

    //custom parse
    $aResp = array();
    $i=0;
    $parser = xml_parser_create();
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
    // xml_parse_into_struct($parser, $string, $values, $tags);
    xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
    xml_parse_into_struct($parser, trim($string), $values); 
    xml_parser_free($parser);
    // var_dump($values);
    foreach($values as $val) {
        foreach($val as $key=>$value) {
            if($key=='value'){
                if(is_array($value)) {
                    foreach($value as $k=>$v) {
                        echo $v;
                        $value[$i]=$value;
                    }
                }else {
                    $aResp[$i]=$value;
                    echo '<h1>'.$key.'</h1>';
                    echo '<h2>'.$value.'</h2><br>';
                }
                $i++;
            }

        }
    }
}

ここで壁にぶつかっているので、助けていただければ幸いです。考えられるすべてのリソースを調べましたが、運が悪かったです。ありがとうございました!

4

0 に答える 0