【问题标题】:print xml response separately for each property分别为每个属性打印 xml 响应
【发布时间】:2015-05-04 12:11:43
【问题描述】:

我正在尝试将此 XML 转换为数组,这是我从 API 获得的响应,我想获取 statuscode 的值,但我无法做到。

<?xml version='1.0' encoding='utf-8' standalone='no'?>
<REGISTRATIONRESPONSE>
<STATUSCODE>20</STATUSCODE>
<STATUS>1234</STATUS> 
</REGISTRATIONRESPONSE>

但是当我使用以下代码时

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 6);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,'RequestData='.$post);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/x-www-form-urlencoded'));
$result = curl_exec($ch);
$resultres=xml2ary($result);
echo '<pre>';
print_r($resultres);

输出是

Array
 (
    [string] => Array
    (
            [_a] => Array
            (
                [xmlns] => http://tempuri.org/
            )
            [_v] => 201234
    )
)

结果如何变化?我还使用了另一种技术,但我也没有得到所需的结果

【问题讨论】:

  • 请发布原始$result。还有你的$post是什么,对吗?
  • 问题中的第一个 xml 是原始 $result 和 $post 是 xml 我发送它是正确的我也得到了正确的结果,但我无法分离值并将其放入变量。
  • xml2ary() 是一个自定义函数。我们应该猜测它的实现吗?
  • 那个函数不工作所以离开它你能建议任何其他方法从 XML 中获取值吗?
  • 给我你的 curl 网址

标签: php arrays xml api curl


【解决方案1】:

看看SimpleXML

<?php

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 6);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,'RequestData='.$post);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/x-www-form-urlencoded'));
$result = curl_exec($ch);

/** @var SimpleXMLElement $xml */
$xml = simplexml_load_string($result);

// nice, use SimpleXMLElement object
var_dump($xml);

// not nice, use array instead
var_dump((array) $xml);

只需确保您从 API 获得的 XML 响应与您在上面发布的相同。再次供大家参考:

<?xml version='1.0' encoding='utf-8' standalone='no'?>
<REGISTRATIONRESPONSE>
    <STATUSCODE>20</STATUSCODE>
    <STATUS>1234</STATUS>
</REGISTRATIONRESPONSE>

这是一个没有 cURL 的示例,只需将其添加到文件并从终端运行即可:

<?php

$xmlString = <<<XML
<?xml version='1.0' encoding='utf-8' standalone='no'?>
    <REGISTRATIONRESPONSE>
    <STATUSCODE>20</STATUSCODE>
    <STATUS>1234</STATUS>
</REGISTRATIONRESPONSE>
XML;

$xml = simplexml_load_string($xmlString);

// everything
var_dump($xml);

// independent values
var_dump((string) $xml->STATUSCODE);
var_dump((string) $xml->STATUS);

// now with arrays
$array = (array) $xml;

// everything
var_dump($array);

// independent values
var_dump($array['STATUSCODE']);
var_dump($array['STATUS']);

// want to print it?

echo sprintf('Registration responded with status code %d and status %d', $xml->STATUSCODE, $xml->STATUS) . PHP_EOL;
echo sprintf('Registration responded with status code %d and status %d', $array['STATUSCODE'], $array['STATUS']) . PHP_EOL;

【讨论】:

  • 感谢您的回复 array(1) { [0]=&gt; string(147) "201234" } 但我得到这个是因为两者的响应结果正在合并
  • 我正在尝试分别获取 STATUSCODE 和 STATUS 的值。
  • 我已经用另一个例子更新了我最初的回复。我们是在谈论我发布的 XML 吗?确保您从 API 中得到相同的结果。
  • 谢谢它工作正常,但我在一个变量中有 XML,所以我不能像你有任何选择一样直接使用它如何添加前缀
  • 如果变量中有 XML,没关系。只要它是一个包含 XML 的字符串,您就可以将其添加到 simplexml_load_string。例如,在您的示例中,$result 变量中的 XML 使用:$xml = simplexml_load_string($result);
【解决方案2】:

如果 XML 正在通过,例如:

<class>
    <type>
        <input>Text</input>
        <input>Text</input>
    </type>
    <type>
        <input>Text</input>
        <input>Text</input>
    </type>
    <type>
        <input>Text</input>
        <input>Text</input>
    </type>
</class>

你可以做的是:

$xml = simplexml_load_file("filepath");
$classes = $xml->$class;
foreach ($classes as $keyClass => $class) {
    echo "<ul><li>Class</li><ul>";
    $types = $class->type;
    foreach ($types as $keyType => $type) {
        echo "<li>Type</li><ul>";
        $inputs = $type->input;
        foreach ($inputs as $keyInput => $input) {
            echo "<li>Input</li>";
        }
        echo "</ul>";
    }
    echo "</ul></ul>";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多