在C#中使用XSLT更新XML - 如何更新同一文件

时间:2010-10-22 06:26:33

标签: c# xml xslt

我的要求是更新XML文件(通过参数识别的一些元素,通过参数再次识别新的属性值)。

我正在使用XSLT通过C#代码执行相同的操作。

我的代码如下:

XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(f_Xslt);
XmlReader xr = XmlReader.Create("SourceXML.xml");
XmlWriter xw = XmlWriter.Create("DestinationXML.xml");
XsltArgumentList argsList = new XsltArgumentList(); 
argsList.AddParam("", "", "");
...
...
...
xslt.Transform(xr, argsList, xw);

在我的XSLT文件中,我首先复制所有元素,属性。然后基于<xsl:template match = ... />,我更新元素,attr / values。

所有这些都保存到Destination.xml

如果我想在Source.xml本身上发生所有这些,该怎么办?

当然,最简单的解决方案(或我目前为止的解决方案)是在成功完成XSLT.Transform后用Destination.XML替换Source.XML。

2 个答案:

答案 0 :(得分:1)

我认为您的转换到文件然后替换解决方案就像您将获得的一样好。您不希望在读取时覆盖Source.XML文件,即使.NET和操作系统允许您这样做。

为了建议一个更好的替代转换到文件然后替换(TTFTR),我会问,你觉得TTFTR是什么不理想?

我能想到的唯一替代方法是将变换的结果写入记忆;转换完成后,将结果从内存保存到源文件中。要转换为内存,请将MemoryStream对象作为参数传递给XmlWriter.Create()

答案 1 :(得分:1)

您永远不应该尝试使用XSLT就地更新。这是糟糕的设计,而不是功能语言的精神。

这就是说,您可以将源XML文件复制到临时目录中,然后将转换应用于创建的XmlWriter实例以覆盖原始文件。

正如我之前所说,我不推荐这个!