来自PHP中的模板和哈希树的动态XML

时间:2012-05-14 14:08:29

标签: php xml tree

大家好!

我在一个相当大的项目中很活跃,但我对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>

这是我们的主要结构。 ProductDescriptionsMatrixProducts基本上是列表项,并且可能不包含多个子项。我们要转换为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());
    }

你会如何解决这个问题?什么是最佳做法?我有点饿和脱水所以请告诉我,如果我错过了一些基本的东西。

1 个答案:

答案 0 :(得分:1)

我在理解你要做的事情时遇到了一些麻烦,所以如果我离开这里,请原谅。您要做的似乎是创建一个基于“模板”的XML文件,其中ArrayObject包含XML元素的属性和值。

也许,您只需创建一个SimpleXML对象,而不是尝试这样做。我认为对于你想要做的事情会更容易,它增加了错误捕获的价值。请参阅PHP.net上的SimpleXML

如果我没有回答正确的话,您可以发布更多源代码,例如包含值的类吗?感谢。