代码之家  ›  专栏  ›  技术社区  ›  thomasrutter

我的PHP应用程序需要导出到一系列不同的XML格式:我应该使用XSLT还是原生PHP?

  •  2
  • thomasrutter  · 技术社区  · 17 年前

    我的PHP应用程序需要能够导出(和从中导入)一系列不同的数据格式,主要是基于XML的。

    我可以选择

    • 在PHP中,使用DOM导出一些基于XML的格式,这些格式是其他格式所需的所有数据的超集,并为我想要支持的每种输出格式创建一个单独的XSLT样式表,通过PHP的XSL扩展运行DOM输出。

    • 不使用PHP的XSL扩展,而是在原生PHP中将每个输出格式实现为一个类,该类使用DOM直接从内部对象/结构转换为给定的XML格式,每个这样的类实现相同的接口,因此它们是可互换的。

    该应用程序将被大学使用,是一个以各种方式管理“人员”记录的工具,并从各种来源(如人力资源系统等)导入/导出。我将自己实现输入和输出格式集,但将来可能有人使用它来修改它以支持自己的格式。

    我考虑不使用XSLT的一个原因是,如果将来除我之外还有其他人要维护这个应用程序,那么似乎很少有人知道XSLT——更多的人似乎知道PHP。

    另一个原因是,第二种似乎是一种更高效、更“程序化”的解决方案,而且更灵活,因为我可以通过重载类的必要部分,轻松地将CSV或基于列的文本等非XML格式输出到或从中导入,而这不是通常需要的。

    你认为我的推理如何?

    3 回复  |  直到 17 年前
        1
  •  4
  •   Stefan Gehrig    17 年前

    也许双向解决方案是正确的选择。您可以构建一个用于导入和导出的适配器系统,该系统对XML数据格式使用XSLT,并提供对所有非基于XML的数据格式使用PHP代码的能力。这样,每个开发人员都可以选择他更喜欢的方式。

    interface My_DataConverter_Interface
    {
        /**
              * @param string                $file
              * @return My_DataObject
              */
        function import($file);
    
        /**
              * @param My_DataObject $data
              * @param string                $file
              */
        function export(My_DataObject $data, $file);
    }
    
    abstract class My_DataConverter_Xslt implements My_DataConverter_Interface
    { /* ... */ }
    
    class My_DataConverter_XmlFormat1 extends My_DataConverter_Xslt
    { /* ... */ }
    
    class My_DataConverter_XmlFormat2 extends My_DataConverter_Xslt
    { /* ... */ }
    
    class My_DataConverter_Csv implements My_DataConverter_Interface
    { /* ... */ }
    
        2
  •  3
  •   cletus    17 年前

    基本上你所说的是桥/适配器/门面类。它们(imho)比XSL模板更灵活、更容易理解。

    我还很高兴看到您希望通过DOM扩展(或等效库)来实现这一点,而不是将XML作为文本来编写,这会引入所有转义问题以及您将避免的其他问题。

    就我个人而言,我还认为XSL模板更容易更改(因为它们对绝大多数程序员来说有些神秘),所以如果您的超集格式发生了更改(让我们直面它),您可能需要更改所有模板。当然,您可能也必须对代码执行此操作,但代码可能更易于维护。

        3
  •  2
  •   lsl    17 年前

    这两种解决方案都会奏效,但我想你知道这一点。

    我可能会自己使用编码解决方案。但这可能是因为XSLT让我头疼。

    XSLT有一个好处,那就是您可以要求提供未经更改的XML的人生成XSLT。。