1

我尝试了许多预构建的解析器,包括 xml2array 解析器,但都没有运气。我也尝试过自己的方法,但也没有任何成功。我已经尝试了 simplexmlelement/xpath 和一堆不同的方法,结果相同,所以我在一个我用头敲键盘的地方。

基本上,我正在尝试解析 API 调用向我吐回的代码。我正在打一个肥皂电话并通过 curl (https) 获取 xml 内容。

这是我返回的 xml 示例:HTTP/1.1 100 Continue

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