我非常感谢以下实施的输入。目标是:生成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以外的东西 - &gt; StringWriter - &gt; XmlWriter构造到达我想要的位置?看起来像是为了完成手头的任务而构建的很多对象 - 这确实有效。现在,工作获胜,但我想让它变得更好。
我非常感谢那些有建设性地评论我在这里所做的经验的人。代码审查,如果你愿意的话?
提前感谢您的时间。
答案 0 :(得分:2)
如果要填充XElement,请使用
XDocument result = new XDocument();
using (XmlWriter xw = result.CreateWriter())
{
ct.Transform(xmlToTransform, xw);
}
returnValue = result.Root;
没有必要使用StringWriter而不需要使用遗留的XmlTextWriter,转换可以直接填充XContainer。
我还将XmlReader和StringReader的使用包装到using
块中。