0

大家好!

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

你会怎么做?什么是最佳实践?我有点饿和脱水,所以请告诉我是否缺少基本的东西。

4

1 回答 1

1

我在理解您要做什么时遇到了一些麻烦,如果我不在,请原谅。看起来您正在尝试做的是基于“模板”创建一个 XML 文件,其中包含一个包含 XML 元素的属性和值的 ArrayObject。

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

如果我的答案不正确,您能否发布更多源代码,例如包含这些值的类?谢谢。

于 2012-05-14T14:23:36.733 回答