我在一个相当大的项目中很活跃,但我对XML的经验有限。我正在动态生成XML,这些数据可以根据个人客户的需求进行定制。目前的解决方案是(请不要伤害我,我是新人)通过include()
内联php模板。这不是一个好的做法,我想转向一个更好的解决方案。
<?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哈希树,它具有类似的结构但具有不同的密钥。
我遇到的问题是我陷入了关于如何从对象动态创建树的思考过程中。我目前的计划是有一个密钥转换表(参见当前的解决方案),但我脑子里的一个声音告诉我这不是最好的做法。
populate.php
foreach($products as $product) {
// too much black magic in here
include($chosenTemplate);
// $productXMLString is generated in the previous include
printToXML($productXMLString)
}
的template.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());
}
你会如何解决这个问题?什么是最佳做法?我有点饿和脱水所以请告诉我,如果我错过了一些基本的东西。
答案 0 :(得分:1)
我在理解你要做的事情时遇到了一些麻烦,所以如果我离开这里,请原谅。您要做的似乎是创建一个基于“模板”的XML文件,其中ArrayObject包含XML元素的属性和值。
也许,您只需创建一个SimpleXML对象,而不是尝试这样做。我认为对于你想要做的事情会更容易,它增加了错误捕获的价值。请参阅PHP.net上的SimpleXML。
如果我没有回答正确的话,您可以发布更多源代码,例如包含值的类吗?感谢。