【问题标题】:Extract values from xml node and add to array in php从xml节点中提取值并添加到php中的数组
【发布时间】:2018-04-12 04:21:55
【问题描述】:

我已经搜索过这个特定问题的答案,但没有找到 - 如果我忽略了某些问题,我深表歉意……这是我的问题……我正在构建两个数据库之间的集成,我正在用 PHP 编码。我从源 API 获得 XML 响应,然后需要从该响应中提取特定数据值并将它们添加到数组中,以便通过其 API 插入到接收器数据库中。我可以从源获取我需要的数据值,但是当我尝试将它们添加到接收器所需的数组格式中时,我得到一个包含键/值对而不是值的数组。

这是我用来提取构建数组所需数据的代码的简短 sn-p:

foreach($invoiceResponse->operation->result->data->sodocument as $sodoc){
    $invoice = array("Invoice_ID"=>$sodoc->DOCNO, "Invoice_Date"=>$sodoc->WHENPOSTED)
}

生成的数组如下所示:

{"Invoice_ID":{"0":"SI-000525"},"Invoice_Date":{"0":"03\/22\/2018"}}

而我想要的是这样的:

{"Invoice_ID":"SI-000525","Invoice_Date":"03\/22\/2018"}

这是来自源代码的 xml 格式的快照:

<response>
    <control>
        <status>success</status>
    </control>
    <operation>
        <authentication>
            <status>success</status>
            <sessiontimestamp>2018-04-12T08:14:55-07:00</sessiontimestamp>
        </authentication>
        <result>
            <status>success</status>
            <function>readByQuery</function>
            <data listtype="sodocument" count="1" totalcount="1" numremaining="0" resultId="">
                <sodocument>
                    <PROJECT>GER-0318-DIG-005</PROJECT>
                    <CONTACT.COMPANYNAME>FFF Production Service</CONTACT.COMPANYNAME>
                    <TYPE_OF_INVOICE>Bill in Full</TYPE_OF_INVOICE>
                    <WHENPOSTED>04/10/2018</WHENPOSTED>
                    <STATE>Pending</STATE>
                </sodocument>
...

我使用以下方法将 xml 转换为 php 中的数组:

$response = simplexml_load_string($xml_response);

我可以在一个简单的语句中提取数据,例如这样一行代码:

$query = "DOCHDRID = '".$sodoc->DOCID."'";

结果

DOCHDRNO = 95

所以数据在这里被正确提取,但是当我使用相同的语法将这些值添加到数组时,我遇到了上述问题。

我确信这很容易,但我将非常感谢任何帮助!谢谢!

【问题讨论】:

  • Cast 将值转换为适当的类型(没有强制转换,它们是 SimpleXMLElement 对象),例如$invoice = array("Invoice_ID"=&gt; (int) $sodoc-&gt;DOCNO, "Invoice_Date"=&gt; (string) $sodoc-&gt;WHENPOSTED);

标签: php arrays xml loops


【解决方案1】:

看起来$sodoc-&gt;DOCNO$sodoc-&gt;WHENPOSTED 中有数组所以在获取数据时获取第一个索引

foreach($invoiceResponse->operation->result->data->sodocument as $sodoc){
    $invoice = array("Invoice_ID"=>$sodoc->DOCNO[0], "Invoice_Date"=>$sodoc->WHENPOSTED[0])
}

【讨论】:

  • 感谢您的回复 - 但这并没有解决问题。我正在向原始问题添加更多信息,看看是否有帮助...
  • 答案和评论的结合解决了问题!生成的代码有效:$invoice = array("Invoice_ID =&gt; (string) $sodoc-&gt;DOCNO[0], "Invoice_Date"=&gt;(string) $sodoc-&gt;WHENPOSTED[0]) 我唯一仍然遇到问题的是节点名称如 CONTACT.COMPANYNAME 的数据项。当我对那些使用相同的语法时,我得到一个语法错误。任何想法如何处理这些?
  • 忽略上面的第二个问题-在这里找到答案:[stackoverflow.com/questions/6531380/…-正确的语法是array("State"=&gt; (string)$sodoc-&gt;{'CONTACT.STATE'})
猜你喜欢
  • 2014-06-17
  • 2014-05-04
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多