2011-06-09 124 views
0

我有一个将输入XML节点映射到另一个节点(它不使用XSLT)的映射器实用程序。在运行时,它会遍历XML节点并将其转换。光荣的节点到节点转换器,但效率不高,并有一个我们无法克服的性能障碍。最好的部分是它编写一个定义文件,列出入站XML元素及其相应的转换名称。我想在.NET中编写一个工具,它将读取此定义文件并自动生成一个XSLT。一旦它生成XSLT,我就可以使用XSLTC进行编译,并在我的Web应用程序中使用反射将其包含在运行时转换中。任何想法,指导,可用来实现这一目标的建议或工具是非常赞赏自动生成XSL文件

下面是一个过度简化的例子

<order><order_id>12345</order_id><customer>Cust1</customer></order> 

定义文件

[Header] 
order=customer_order 
[Fields] 
order_id=order_number 
customer=customer_number 

工具运行使用定义文件转换并在转换后生成下面的xml

<customer_order><order_number>12345</order_number><customer_number>Cust1</customer_number></customer_order> 
+1

可能已经知道,但为了以防万一,确保当前的效用 - 或者你打造一个 - 使用StringBuilder类,而不是连接字符串。可以做出100倍的差异(荣耀的猜测,但我打赌不远)。 – FastAl 2011-06-10 02:20:06

+0

@FastAl - 感谢您的回复。 StringBuilder已经存在,但问题是定义文件在运行时被读取。这些文件可能很大,因为XML很大。 CPU和内存使用量都激增。作为一个示例,我们选择了1个XML,编写了一个XSLT,将其编译并应用于入站XML。该过程需要几毫秒才能完成,而不会给CPU和内存造成压力。 – G33kKahuna 2011-06-10 15:04:50

+0

只是我的两分钱:也许你可以修改你的工具来产生更多的XML风格输出''那么你可以写一个xslt,它自己写一个xslt以进行正确的转换(这是可能的)! – therealmarv 2011-07-09 00:26:34

回答

0

有趣。从你的回答中,并不完全清楚哪一部分是缓慢的,但我同意XSLT可能会因为几个原因产生更快的结果。

  • XSLT将定位为每个节点的规则更快,尤其是重要的,如果有一个大量的规则
  • XSLT将非常有效地构建生成的XML。

XSLT方法将启动并建立从身份模板(即复制一个XML到另一个),然后添加模板,根据需要转换。你只需要遍历你的规则并为每个规则创建。

以下是样本身份模板,添加了3条规则。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<!-- order=customer_order --> 
<xsl:template match="order"> 
    <customer_order><xsl:apply-templates select="@*|node()"/></customer_order> 
</xsl:template> 

<xsl:template match="order_id"> 
    <order_number><xsl:apply-templates select="@*|node()"/></order_number> 
</xsl:template> 

<xsl:template match="customer"> 
    <customer_number><xsl:apply-templates select="@*|node()"/></customer_number> 
</xsl:template> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

而生成的XML

<?xml version="1.0"?> 
<customer_order> 
    <order_number>12345</order_number> 
    <customer_number>Cust1</customer_number> 
</customer_order> 

好运