php解析xml到相同级别相同名称键的数组

时间:2012-04-21 20:03:08

标签: php xml soap xml-parsing

我尝试了许多预先构建的解析器,包括xml2array解析器,没有运气。我也尝试过我自己也没有任何成功。我尝试过simplexmlelement / xpath以及一系列具有相同结果的不同方法,所以我正处于一个我正在敲击键盘的地方。

基本上我正在尝试解析API调用回吐给我的代码。我正在拨打肥皂电话并通过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++;
            }

        }
    }
}

任何帮助都会受到赞赏,因为我在这里碰到了一堵墙。我已经检查了所有我能想到的资源而没有运气。谢谢!

0 个答案:

没有答案