【问题标题】:Right design approach: Parsing xml正确的设计方法:解析xml
【发布时间】:2017-09-20 01:24:36
【问题描述】:

我通过调用另一个 .net 应用程序来取回我收到的整合产品 xml。 Xml 包含各种子产品的数据,如 P1、P2、P3 等。我需要编写一个 C# 程序来解析 xml,然后将其分解为三个单独的 xmls..即每个子产品 P1、P2、P3....等一个。每个子产品解析xml的业务规则(或标准)不同。

将来,输入 xml 还可能包含新的附加子产品 P4、P5 等的信息。 所以我还需要把这个 xml 分解成那些新的子产品。

从模块设计的角度来看,子产品类型及其解析标准应该是可扩展和可配置的。这样当需要处理新的子产品时,只需要更改配置,无需更改代码必填。

所以我在想下面的方法。听起来够好吗?

1.在数据库中添加一个名为T的新查找表。

2.添加3列:Id(int)、Sub-ProductName(varchar)、Criteria(varchar)

3.要在数据库中配置一个子产品,比如P1,该行可能如下所示:

1--P1--ProductType='XYZ'|ProductCategory='ABC'|
2--P2--....
3--P3--...

这里,ProductType 和 ProductCategory 是输入 xml 中的有效元素名称。

4.然后在C#程序中,使用反射处理Criterion列值,并对输入的xml应用规则,得到对应子产品名称的xml,即P1..

谢谢。

【问题讨论】:

  • 我喜欢通过设计数据库架构来开始一个项目。拥有一个好的数据库总是让其余的编码变得更容易。我还喜欢使用 c# 中的数据表作为数据库和其余 c# 代码之间的主要接口。从数据表中,您可以轻松地将结果显示到 DGV。也使用数据表 Read/WriteXml() 方法将数据读/写到 xml 文件。如果 WriteXml 数据表方法当前不相同,我还将更改当前 xml 文件的结构以匹配。如果您的方法是一样的,但我认为它接近我的。

标签: c# xml


【解决方案1】:

最简单的方法是调用 XSLT 样式表(XSLT 2.0 或更高版本,所以使用 Saxon 或 XmlPrime)。

如果标准是固定的,那么样式表可以做类似的事情

<xsl:transform....>

<xsl:template match="P1">
   <xsl:result-document href="subproduct1.xml">
     <xsl:copy-of select="."/>
   </xsl:result-document>
</xsl:template>

<xsl:template match="P2">
   <xsl:result-document href="subproduct2.xml">
     <xsl:copy-of select="."/>
   </xsl:result-document>
</xsl:template>

...
</xsl:transform>

如果在产品定义更改时更改此样式表感觉太像“代码更改”,那么您可以从产品结构的某些更高级别的定义生成此样式表。 XSLT 的好处之一是,作为 XML,您可以编写 XSLT 样式表(称为元样式表)来生成 XSLT 样式表。这并不像听起来那样异国情调。这是一种相当普遍的做法。

【讨论】:

  • 感谢迈克尔的投入。如果输入是可序列化的对象,那么我提到的方法就足够了吗?谢谢。
  • 我不确定您想到的方法或可序列化的位置;我只是告诉你我会怎么做。 (StackOverflow 上的设计问题通常被认为是“基于意见的”而被拒绝,这是有理由的:您没有说明任何标准可以让客观地判断一种设计优于另一种设计。)
猜你喜欢
  • 2014-05-31
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
相关资源
最近更新 更多