大家好!
我在一个相当大的项目中很活跃,但我在 XML 方面的经验有限。我正在动态生成 XML,这些数据可以根据个别客户的需求进行定制。当前的解决方案是(请不要伤害我,我是新人)通过include()
. 这不是好的做法,我想转向更好的解决方案。
结构
<?xml version='1.0'?>
<Product id="">
<AswItem></AswItem>
<EanCode></EanCode>
<ImagePopup></ImagePopup>
<ImageInfo></ImageInfo>
<ImageThumbnail></ImageThumbnail>
<PriceCurrency></PriceCurrency>
<PriceValueNoTax></PriceValueNoTax>
<Manufacture></Manufacture>
<ProductDescriptions>
<ProductDescrition language="" id="">
<Name></Name>
<Description></Description>
<Color></Color>
<Size></Size>
<NavigationLevel1></NavigationLevel1>
<NavigationLevel2></NavigationLevel2>
<NavigationLevel3></NavigationLevel3>
<NavigationLevel4></NavigationLevel4>
</ProductDescrition>
</ProductDescriptions>
<MatrixProducts>
<AswItem></AswItem>
<EanCode></EanCode>
<ParentId></ParentId>
<PriceCurrency></PriceCurrency>
<PriceValueNoTax></PriceValueNoTax>
<ImagePopup></ImagePopup>
<ImageInfo></ImageInfo>
<ImageThumbnail></ImageThumbnail>
</MatrixProducts>
</Product>
这是我们的主要结构。ProductDescriptions
并且MatrixProducts
基本上是列表项,并且可能不包含多个子项。我们要翻译成 XML 的对象是一个 PHP 哈希树,它具有相似的结构但具有不同的键。
问题
我遇到的问题是我陷入了关于如何从对象动态创建树的思考过程中。我目前的计划是有一个密钥转换表(请参阅当前解决方案),但我脑后的声音告诉我这不是最佳实践。
以前的解决方案
填充.php
foreach($products as $product) {
// too much black magic in here
include($chosenTemplate);
// $productXMLString is generated in the previous include
printToXML($productXMLString)
}
模板.php
<?
echo "<Product id='{$product['id']}'>";
// etc...
echo "</product>";
如您所见,这是一种非常糟糕的方法。糟糕的错误处理、凌乱的语法和许多其他怪癖。
当前解决方案
$xmlProductTemplate = simplexml_load_file($currentTemplate);
foreach($products as $product) {
$xmlObj = clone $xmlProductTemplate;
foreach($product as $key => $productValue) {
// if value is a <$key>$string</$key>, just input
// it into the translated key for the $xmlObject
if(!is_array($productValue))
$xmlObj[translateKeyToXML($key)] = $productValue;
// elseway, we need to call the magic; traverse a child array
// and still hold true to templateing
else {
// what DO you do?
}
}
// save xml
fputs($xmlObj->asXML());
}
你会怎么做?什么是最佳实践?我有点饿和脱水,所以请告诉我是否缺少基本的东西。