我必须解析和展平由许多单一产品组成的 XML 文件。XML 有完整的文档记录,使用 SimpleXML 很容易在 PHP 中解析 XML。请参阅下面的代码,我是如何从单个产品创建数组的。然后我访问所有必需的密钥并将数据存储在 SQL 数据库中。
我现在的问题是,如何处理不同的子节点。正如您在提供的 XML 片段中看到的那样,可能只有一个“名称”节点,但有时会有两个甚至更多。当有多个这样的节点时,我必须根据“NameType”来决定使用哪个“NameText”。“价格”节点也是如此。
<Product>
<Id>123</Id>
<Name>
<NameType>3</NameType>
<NameText>Hello World</NameText>
</Name>
<Price>
<Country>US</Country>
<Amount>9.90</Amount>
</Price>
</Product>
<Product>
<Id>124</Id>
<Name>
<NameType>1</NameType>
<NameText>Goodbye Cruel World</NameText>
</Name>
<Name>
<NameType>3</NameType>
<NameText>Goodbye Cruel World, I'm Leaving You Today</NameText>
</Name>
<Name>
<NameType>9</NameType>
<NameText>Goodbye</NameText>
</Name>
<Price>
<Country>CAN</Country>
<Amount>27.90</Amount>
</Price>
<Price>
<Country>US</Country>
<Amount>19.90</Amount>
</Price>
</Product>
这是我处理这个问题的代码:我将 XML 转换为关联数组,然后使用大量 if-magic 来获取我需要的数据。提供的代码打印出第一个产品示例的“Hello World”和第二个产品示例的“Goodbye Cruel World”。
$xml = simplexml_load_string($product);
$json = json_encode($xml);
$arr = json_decode($json, True);
// $arr['Name']['NameText'] contains the single NameText for this product in example one
// $arr['Name'][0]['NameText'] contains the first of three NameTexts in example two
if( array_key_exists(0, $arr['Name']) ) {
foreach( $arr['Name'] as $n) {
if( $n['NameType'] == 1 ) {
echo $n['NameText']."\n";
break;
} elseif ( $n['NameType'] == 3 ) {
echo $n['NameText']."\n";
break;
}
}
} else {
echo $arr['Name']['NameText']."\n";
}
虽然这段代码正在运行,但我对可能多次出现的所有节点的逐个案例分析并不满意。而且我什至必须依赖子节点的“正确”顺序,假设 NameType“1”总是发生在 NameType“3”之前。所以我倾向于希望有一个更聪明的解决方案。
每个父节点的子节点数量不同的问题XML似乎很相似,但它并没有真正解决子节点数量不同的部分以及选择特殊子节点的任务。