我的要求是更新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。
答案 0 :(得分:1)
我认为您的转换到文件然后替换解决方案就像您将获得的一样好。您不希望在读取时覆盖Source.XML文件,即使.NET和操作系统允许您这样做。
为了建议一个更好的替代转换到文件然后替换(TTFTR),我会问,你觉得TTFTR是什么不理想?
我能想到的唯一替代方法是将变换的结果写入记忆;转换完成后,将结果从内存保存到源文件中。要转换为内存,请将MemoryStream对象作为参数传递给XmlWriter.Create()。
答案 1 :(得分:1)
您永远不应该尝试使用XSLT就地更新。这是糟糕的设计,而不是功能语言的精神。
这就是说,您可以将源XML文件复制到临时目录中,然后将转换应用于创建的XmlWriter
实例以覆盖原始文件。
正如我之前所说,我不推荐这个!