0

我非常感谢对以下实施的投入。目标是:生成一个 XElement,尽可能避免文件系统读/写。

private XElement ProduceApiXml(KeyValuePair<string, ConfigScriptOutput> kvp)
{
    XElement returnValue = null;
    // load xsl file
    XslCompiledTransform ct = new XslCompiledTransform();
    string xslFile = Path.Combine(_assemblyDir, ConfigurationManager.AppSettings["ConfigOutputXslFile"]);
    ct.Load(xslFile);
    XmlReader xmlToTransform = XmlReader.Create(new StringReader(kvp.Value.ScriptStdOut));
    StringBuilder sb = new StringBuilder();
    StringWriter sw = new StringWriter(sb);
    XmlWriter xmlTransformed = new XmlTextWriter(sw);
    ct.Transform(xmlToTransform, xmlTransformed);

    returnValue = XElement.Parse(sb.ToString());
    return returnValue;
}

这是我第一次使用这个 XslCompiledTransform 类,我想我可以改进它。我真正关心的是我是否应该使用除 StringBuilder -> StringWriter -> XmlWriter 构造之外的东西来到达我想去的地方?似乎有很多对象是为了完成手头的任务而构建的——这确实有效。现在,工作赢了,但我想让它变得更好。

我真的很感谢那些有经验的人对我在这里所做的事情进行建设性的评论。代码审查,如果你愿意?

在此先感谢您的时间。

4

1 回答 1

2

如果要填充 XElement,请使用

XDocument result = new XDocument();
using (XmlWriter xw = result.CreateWriter())
{
  ct.Transform(xmlToTransform, xw);
}
returnValue = result.Root;

无需使用 StringWriter 也无需使用旧版 XmlTextWriter,转换可以直接填充 XContainer。

我还将 XmlReader 和 StringReader 的使用包装到using块中。

于 2012-09-14T16:34:04.710 回答