,所以我要连接到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->数据集是否存在。