【问题标题】:How to extract xml response in php and create json response如何在php中提取xml响应并创建json响应
【发布时间】:2016-08-12 07:56:06
【问题描述】:

使用 $result = curl_exec($ch); 从服务器获取 xml 响应后 我想从 xml 响应中提取一些数据并将提取的数据构建为有效的 json 格式并将该 json 发送到 android 中的移动应用程序

这是我从我的服务器得到的。

<ENVELOPE>
 <HEADER>
  <VERSION>1</VERSION>
  <STATUS>1</STATUS>
  </HEADER>
 <BODY>
  <DESC>
   <CMPINFO>
    ...
   </CMPINFO>
  </DESC>
  <DATA>
       <COLLECTION ISMSTDEPTYPE="Yes" MSTDEPTYPE="512">
    <STOCKITEM NAME="Abc Test" RESERVEDNAME="">
     <STOCKITEMNAME TYPE="String">Abc Test</STOCKITEMNAME>
     <CLOSINGBALANCE TYPE="Quantity"> 102 Nos</CLOSINGBALANCE>
     <OPENINGBALANCE TYPE="Quantity"> 500 Nos</OPENINGBALANCE>
     <DEBITTOTALS TYPE="Quantity"> 418 Nos</DEBITTOTALS>
     <CREDITTOTALS TYPE="Quantity"> 20 Nos</CREDITTOTALS>
     <OPENINGVALUE TYPE="Amount">-1000000.00</OPENINGVALUE>
     <CLOSINGVALUE TYPE="Amount">-366400.00</CLOSINGVALUE>
     <OUTWARDVALUE TYPE="Amount">4180000.00</OUTWARDVALUE>
     <INWARDVALUE TYPE="Amount">-2400.00</INWARDVALUE>
     <BASICQTY TYPE="Quantity"></BASICQTY>
     <OPENINGRATE TYPE="Rate">2000.00/Nos</OPENINGRATE>
     <CLOSINGRATE TYPE="Rate">1927.69/Nos</CLOSINGRATE>
     <TBALCLOSING TYPE="Amount">-366400.00</TBALCLOSING>
     <TBALOPENING TYPE="Amount">-1000000.00</TBALOPENING>
     <STKOPBALANCE TYPE="Quantity"> 500 Nos</STKOPBALANCE>
     <STKCLBALANCE TYPE="Quantity"> 102 Nos</STKCLBALANCE>
     <TBALDEBITS TYPE="Amount">-2400.00</TBALDEBITS>
     <TBALCREDITS TYPE="Amount">4180000.00</TBALCREDITS>
     <STKINQTY TYPE="Quantity"> 20 Nos</STKINQTY>
     <STKOUTQTY TYPE="Quantity"> 418 Nos</STKOUTQTY>
     <TBALNETTCREDITS TYPE="Amount">4180000.00</TBALNETTCREDITS>
    </STOCKITEM>
    <STOCKITEM NAME="Gas" RESERVEDNAME="">
     <STOCKITEMNAME TYPE="String">Gas</STOCKITEMNAME>
     <CLOSINGBALANCE TYPE="Quantity"></CLOSINGBALANCE>
     <OPENINGBALANCE TYPE="Quantity"></OPENINGBALANCE>
     <DEBITTOTALS TYPE="Quantity"></DEBITTOTALS>
     <CREDITTOTALS TYPE="Quantity"></CREDITTOTALS>
     <OPENINGVALUE TYPE="Amount">0.00</OPENINGVALUE>
     <CLOSINGVALUE TYPE="Amount"></CLOSINGVALUE>
     <OUTWARDVALUE TYPE="Amount"></OUTWARDVALUE>
     <INWARDVALUE TYPE="Amount"></INWARDVALUE>
     <BASICQTY TYPE="Quantity"></BASICQTY>
     <OPENINGRATE TYPE="Rate"></OPENINGRATE>
     <CLOSINGRATE TYPE="Rate"></CLOSINGRATE>
     <TBALCLOSING TYPE="Amount"></TBALCLOSING>
     <TBALOPENING TYPE="Amount">0.00</TBALOPENING>
     <STKOPBALANCE TYPE="Quantity"></STKOPBALANCE>
     <STKCLBALANCE TYPE="Quantity"></STKCLBALANCE>
     <TBALDEBITS TYPE="Amount"></TBALDEBITS>
     <TBALCREDITS TYPE="Amount"></TBALCREDITS>
     <STKINQTY TYPE="Quantity"></STKINQTY>
     <STKOUTQTY TYPE="Quantity"></STKOUTQTY>
     <TBALNETTCREDITS TYPE="Amount"></TBALNETTCREDITS>
    </STOCKITEM>
    ....

   </COLLECTION>
  </DATA>
 </BODY>
</ENVELOPE>

这只是提供大量数据的示例。假设如果我只需要 STOCKITEMNAME、CLOSINGBALANCE、STKINQTY 等... json 文件中的标记值。这个值在数组中。我试过这样...

<?php
.
.
.
$retValue = curl_exec($ch);          
curl_close($ch);
$oXML = simplexml_load_string($retValue );
//echo $sXML;

$hd = array();

foreach ($oXML as $s):
$hd[$s]=$s->DATA->COLLECTION->STOCKITEM;
endforeach;

//$response["error"]                = FALSE;
$response["resp"]               = $hd;
//echo $header;
echo json_encode($response);

?>

但这不起作用... 请帮帮我

【问题讨论】:

  • $oXML的返回数据是什么?
  • @aldrin27 它将提供的 xml 作为 SimpleXMLElement 对象返回。它看起来只是 xml 响应,但采用对象格式..
  • 我能看到这个物体吗?
  • @aldrin27 很大,不能在评论中粘贴 :(
  • @aldrin27 它是 SimpleXMLElement 对象 ( [HEADER]=> ([VERSION]=>1[STATUS]=>1)[BODY] =>([DESC]=>([CMPINFO] = >(0]=>))[DATA]=>([COLLECTION]=>([@attributes]=>Array()[STOCKITEM]=>Array([0]=>()[STOCKITEMNAME]=>Abc 测试[CLOSINGBALANCE]=>102 个....[TBALDEBITS]=>-2400.00[TBALCREDITS]=>4180000.00[STKINQTY]=>20 个[STKOUTQTY]=>418 个[TBALNETTCCREDITS]=>4180000.00))))))

标签: php arrays json xml xml-parsing


【解决方案1】:

STOCKITEM 元素是一个元素数组。您必须抓取STOCKITEM 的每个子元素,例如STOCKITEMNAME 等。

<?php
$oXML = simplexml_load_string($retValue);

$i = 0;
$hd = [];
foreach ($oXML->BODY->DATA->COLLECTION->STOCKITEM as $item):
    $hd[$i]['STOCKITEMNAME']= (string) $item->STOCKITEMNAME;
    $hd[$i]['DEBITTOTALS']= (string) $item->DEBITTOTALS;
    # continue with elements you want ...
    $i++;
endforeach;

【讨论】:

  • 这是给出带有通知和警告的输出... E_NOTICE:类型 8——试图获取非对象的属性——在第 58 行 E_WARNING:类型 2——为 foreach( ) -- 在第 58 行 {"error":false,"resp":{"BODY":{"STOCKITEMNAME":"Gas"}}} 以及如何增加 $index?它只显示第一个索引值而不是 0 2 3...
  • 好的,我对我的回答做了一些修改。这似乎有效。
  • 嘿,在这种情况下该怎么办“无效请求”来获取MSG节点值。 MSG 是 MSG.LIST 的孩子。我试过 $hd[1]['MSG'] = (string) $array_data->BODY->DATA->STATUS->MSG.LIST->MSG;但它给出了错误类型:4消息:语法错误,意外'->'(T_OBJECT_OPERATOR),期待'('。我认为错误是因为“MSG.LIST”
猜你喜欢
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 2020-10-27
  • 2015-02-11
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
相关资源
最近更新 更多