在C#中推广和聚合XML转储的最佳方法是什么?

Gil*_*lla 8 c# generics design-patterns linq-to-xml

以下是该问题的业务部分:

  • 几个不同的公司发送要处理的信息的XML转储.
  • 公司发送的信息类似......不完全相同.
  • 很多公司很快就会入伍,并开始发送信息

现在,问题的技术部分是我想在C#中编写一个通用的解决方案来容纳这些信息进行处理.我将在我的C#类中转换XML以适应我的数据库模型.

是否有任何模式或解决方案可以一般性地处理这个问题,而不需要在以后添加许多公司时更改我的解决方案?

编写解析器/转换器的最佳方法是什么?

Jag*_*mag 11

这就是我过去做过类似事情的方式.

只要每个公司都有自己的固定格式,用于XML转储,

  1. 为每个公司准备一个特定的XSLT.
  2. 有一种方法可以指示从哪里获取转储(每个公司可能有不同的DUMP文件夹)
  3. 在您的程序中,基于2,选择1并将其应用于DUMP
  4. 所有XSLT都将XML转换为您的一个标准数据库模式
  5. 将其保存到您的数据库

每个新公司的添加最多都是一个新的XSLT.在模式非常相似的情况下,可以重新使用XSLT,然后对它们进行特定的更改.

回顾这种方法:如果你没有合适的工具,调试XSLT可能会有点痛苦.然而,许多XML编辑器(例如XML Spy等)具有出色的XSLT调试功能.


Isa*_*ham 2

在我看来,您只是在要求一种设计模式(或一组模式),您可以使用它以通用的、面向未来的方式来做到这一点,对吧?

理想情况下,您可能需要一些属性

  • 每个“变压器”都是相互解耦的。
  • 您可以轻松添加新的“变压器”,而无需重写主要的“驱动程序”例程。
  • 每次修改变压器或至少添加一个新变压器时,您不需要重新编译/重新部署整个解决方案。

理想情况下,每个“转换器”都应该实现您的驱动程序例程了解的通用接口 - 称之为 IXmlTransformer。该接口的职责是接收 XML 文件并返回用于保存到数据库的任何对象模型/数据集。每个变压器都会实现这个接口。对于所有转换器共享的通用逻辑,您可以创建一个所有继承自的基础类,或者(我的首选)拥有一组可以从其中任何一个调用的辅助方法。

我将首先使用工厂从主驱动程序例程创建每个“变压器”。工厂可以使用反射来询问它可以看到的所有程序集,或者像 MEF 这样的东西可以为你做很多工作。您的驱动程序逻辑应该使用工厂来创建所有变压器并存储它们。

然后,您需要一些逻辑和机制来“查找”给定 Transformer 接收到的每个 XML 文件 - 也许每个 XML 文件都有一个可用于识别的标头或类似的内容。同样,您希望将它们与主逻辑分离,以便您可以轻松添加新的变压器,而无需修改驱动程序例程。例如,您可以将 XML 文件提供给每个转换器并询问它“您可以转换该文件吗”,然后由每个转换器对给定文件“负责”。

每次您的驱动程序例程获取一个新的 XML 文件时,它都会查找适当的转换器并运行它;结果被发送到DB处理区。如果找不到转换器,则将文件转储到目录中以供稍后查询。

我建议阅读 Robert Martin 所著的《敏捷原则、模式和实践》(http://www.amazon.co.uk/Agile-Principles-Patterns-Practices-C/dp/0131857258) 等书,其中给出了适当的示例针对像您这样的情况的设计模式,例如工厂和 DIP 等。

希望有帮助!