2017-09-20 85 views
1

我找到一个整合的产品xml,通过调用另一个.net应用程序来获得。 Xml包含P1,P2,P3等各种子产品的数据。我需要编写一个C#程序来解析xml,然后将其分解为三个单独的xmls..i.e.one,用于每个子产品P1,P2,P3 ....等。用于解析每个子产品的xml的业务规则(或标准)是不同的。正确的设计方法:解析xml

在未来,输入XML可能还包含新的额外的子产品信息P4,P5等 所以我需要打破这种XML到这些新的子产品为好。

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

所以我想到了以下的方法。它听起来够好吗?

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

2.增加3列:ID(INT),子产品名称(VARCHAR),标准(VARCHAR)

3.To配置子产品说P1在数据库中,则该行可能看起来像如如下:

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

这里,ProductType和产品分类在输入有效的XML元素名称。

4.然后在C#程序,进程使用反射并应用对所述输入XML规则以获得对于相应的子产品名称即P1 XML中的标准列值..

感谢。

+0

我喜欢通过设计数据库体系结构来开始一个项目。拥有一个好的数据库总是会使编码的其余部分变得更加容易。我还希望使用c#中的数据表作为数据库与其余c#代码之间的主要接口。从数据表中,您可以轻松地将结果显示给DGV.Also使用数据表Read/WriteXml()方法将数据读/写到xml文件中。如果WriteXml数据表的方法目前不相同,我还会更改当前xml文件的结构以匹配。从您的描述中无法告诉您的方法是一样的,但我认为它接近我的。 – jdweng

回答

0

最简单的方法是调用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样式表。这听起来并不奇怪,这是一个相当普遍的做法。

+0

感谢迈克尔的投入。如果输入是一个可序列化的对象,那么我提到的方法就足够了吗?谢谢。 –

+0

我不确定你在想什么方法或在哪里可以序列化进入它;我只是告诉你我该怎么做。 (有关StackOverflow的设计问题经常被拒绝为“基于意见”,并且有理由:您没有提出任何标准,允许一个设计客观地比另一个更好地进行评判。) –