我正在使用Simple
XML来解析来自不同房地产经纪人的属性列表的XML提要. XML Feed的相关部分看起来像这样:
<branch name="Trustee Realtors"> <properties> <property> <reference>1</reference> <price>275000</price> <bedrooms>3</bedrooms> </property> <property> <reference>2</reference> <price>350000</price> <bedrooms>4</bedrooms> </property> <property> <reference>3</reference> <price>128500</price> <bedrooms>4</bedrooms> </property> </properties> </branch> <branch name="Quick-E-Realty Inc"> <properties> <property> <reference>4</reference> <price>180995</price> <bedrooms>3</bedrooms> </property> </properties> </branch>
然后转换为这样的数组:
$xml = file_get_contents($filename); $xml = simplexml_load_string($xml); $xml_array = json_decode(json_encode((array) $xml),1); $xml_array = array($xml->getName() => $xml_array);
我遇到的问题是,当创建数组时,单个列表的数据在数组中与多个列表的位置不同 – 我不确定如何解释这个,但如果我var_dump()它看起来像这样的多个项目的数组:
array(3) { [0]=> array(3) { ["reference"]=> string(4) "0001" ["price"]=> string(6) "275000" ["bedrooms"]=> int(3) } [1]=> array(3) { ["reference"]=> string(4) "0002" ["price"]=> string(6) "350000" ["bedrooms"]=> int(4) } [2]=> array(3) { ["reference"]=> string(4) "0003" ["price"]=> string(6) "128500" ["bedrooms"]=> int(2) } }
如果我var_dump()单个列表的数组,它看起来像这样:
array(3) { ["reference"]=> string(4) "0004" ["price"]=> string(6) "180995" ["bedrooms"]=> int(3) }
但我需要它看起来像这样:
array(1) { [0]=> array(3) { ["reference"]=> string(4) "0004" ["price"]=> string(6) "180995" ["bedrooms"]=> int(3) } }
这些数组中的每一个都代表来自单个房地产经纪人的房产列表.我不确定这是否只是SimpleXML或json函数的工作方式,但我需要的是使用相同的格式(包含属性列表的数组是[0]键的值).
提前致谢!
SimpleXML像这样古怪.我最近使用它试图使配置文件“更容易”编写,并在过程中发现SimpleXML并不总是一致.在这种情况下,我认为您将受益于简单地检测< property>是一个集合中唯一的一个,如果是,那么将它自己包装在一个数组中,然后将它发送到你的循环中.
注意:[‘root’]是因为我需要包装’< root>< / root>‘ XML周围的元素,使我的测试工作.
//Rebuild the properties listings $rebuild = array(); foreach($xml_array['root']['branch'] as $key => $branch) { $branchName = $branch['@attributes']['name']; //Check to see if 'properties' is only one,if it //is then wrap it in an array of its own. if(is_array($branch['properties']['property']) && !isset($branch['properties']['property'][0])) { //Only one propery found,wrap it in an array $rebuild[$branchName] = array($branch['properties']['property']); } else { //Multiple properties found $rebuild[$branchName] = $branch['properties']['property']; } }
这需要重建您的属性.感觉有点hackish.但基本上你在这里检测到缺少多维数组:
if(is_array($branch['properties']['property']) && !isset($branch['properties']['property'][0]))
如果您没有找到多维数组,那么您明确地生成单个< property>中的一个.然后,为了测试所有内容都已正确重建,您可以使用以下代码:
//Now do your operation...whatever it is. foreach($rebuild as $branch => $properties) { print("Listings for $branch:\n"); foreach($properties as $property) { print("Reference of " . $property['reference'] . " sells at $" . $property['price'] . " for " . $property['bedrooms'] . " bedrooms.\n"); } print("\n"); }
这会产生以下输出:
Listings for Trustee Realtors: Reference of 1 sells at $275000 for 3 bedrooms. Reference of 2 sells at $350000 for 4 bedrooms. Reference of 3 sells at $128500 for 4 bedrooms. Listings for Quick-E-Realty Inc: Reference of 4 sells at $180995 for 3 bedrooms.
并且重建的转储将产生:
Array ( [Trustee Realtors] => Array ( [0] => Array ( [reference] => 1 [price] => 275000 [bedrooms] => 3 ) [1] => Array ( [reference] => 2 [price] => 350000 [bedrooms] => 4 ) [2] => Array ( [reference] => 3 [price] => 128500 [bedrooms] => 4 ) ) [Quick-E-Realty Inc] => Array ( [0] => Array ( [reference] => 4 [price] => 180995 [bedrooms] => 3 ) ) )
我希望这可以帮助您更接近问题的解决方案.