使用php simplexml_load_string()通过XML循环



,所以我要连接到API,并且正在返回XML。

$vehicles = array();
$xml = simplexml_load_string($result);
foreach($xml->Result as $item)
{
   $vehicle = array();
   foreach($item as $key => $value)
   {
        $vehicle[(string)$key] = (string)$value;
   }
   $vehicles[] = $vehicle;
}
print_r($vehicles);

如果i var_dump($ result)它显示(在源代码中):

 string(52055) "<?xml version="1.0" encoding="utf-8"?>
<DataTable xmlns="http://tempuri.org/">
  <xs:schema id="DataSet" 
targetNamespace="http://tempuri.org/DataSet.xsd" 
xmlns:mstns="http://tempuri.org/DataSet.xsd" 
xmlns="http://tempuri.org/DataSet.xsd" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified">
<xs:element name="DataSet" msdata:IsDataSet="true" msdata:MainDataTable="http_x003A__x002F__x002F_tempuri.org_x002F_DataSet.xsd_x003A_Result" msdata:UseCurrentLocale="true">
  <xs:complexType>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="Result">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="newUsed" type="xs:string" minOccurs="0" />
            <xs:element name="unitNumber" type="xs:string" minOccurs="0" />
            <xs:element name="SN" type="xs:string" minOccurs="0" />
            <xs:element name="Make" type="xs:string" minOccurs="0" />
            <xs:element name="Model" type="xs:string" minOccurs="0" />
            <xs:element name="mYear" type="xs:string" minOccurs="0" />
            <xs:element name="availability" type="xs:string" minOccurs="0" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:complexType>
 </xs:element>
</xs:schema>
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<DataSet xmlns="http://tempuri.org/DataSet.xsd">
  <Result diffgr:id="Result1" msdata:rowOrder="0">
    <newUsed>Used</newUsed>
    <unitNumber>3621P</unitNumber>
    <SN>1M2AG11C94M013645</SN>
    <Make>Mack</Make>
    <Model>CV713</Model>
    <mYear>2004</mYear>
    <availability>In Stock</availability>
      </Result>
    </DataSet>
  </diffgr:diffgram>
</DataTable>"

我的问题是,为什么要返回一个空数组?我想念什么?注意:我已经删除了很多XML以更容易阅读。

由于XML文档中的名称空间(其中包含:的元素),您正在遇到问题。您无法使用标准的->单纯操作员访问不同命名空间中的子元素 - 您需要使用children()方法循环循环,或使用XPATH访问它们。我更喜欢后者,尽管取决于您可能无法实现的文档的结构。

$xml = simplexml_load_string($result);
$xml->registerXPathNamespace("DataSet", "http://tempuri.org/DataSet.xsd");
foreach($xml->xpath('//DataSet:Result') as $item) {
  $vehicle = array();
  foreach($item->children() as $value) {
    $vehicle[$value->getName()] = (string) $value;
  }
  $vehicles[] = $vehicle;
}
print_r($vehicles);

我还改变了您如何访问<Result>元素的孩子的方式 - 您无法使用foreach循环访问元素作为键/值对。我已经用拨打getName的标签名称替换了此标签名称,并将其施放到元素内容的字符串中。

有关完整的例子,请参见https://eval.in/864475。

$ xml是XML的根元素,因此其数据词。在数据表和结果之间,层次结构中有一个名为DataSet的节点。

因此您的代码应为

foreach($xml->DataSet->Result as $item)
{
   ...
}

这是一个例子,您必须在访问他的孩子之前测试$ xml->数据集是否存在。

最新更新