C#如何在内存对象中执行实时xslt转换?

我有一个带有2个参数的函数:1 = XML文件,2 = XSLT文件,然后执行转换并返回生成的HTML。

这是function:

///  /// Will apply an XSLT style to any XML file and return the rendered HTML. ///  ///  /// The file name of the XML document. ///  ///  /// The file name of the XSL document. ///  ///  /// The rendered HTML. ///  public string TransformXml(string xmlFileName, string xslFileName) { var xtr = new XmlTextReader(xmlFileName) { WhitespaceHandling = WhitespaceHandling.None }; var xd = new XmlDocument(); xd.Load(xtr); var xslt = new System.Xml.Xsl.XslCompiledTransform(); xslt.Load(xslFileName); var stm = new MemoryStream(); xslt.Transform(xd, null, stm); stm.Position = 1; var sr = new StreamReader(stm); xtr.Close(); return sr.ReadToEnd(); } 

我想更改函数不接受XML的文件,而只是一个对象。 该对象与xslt完全兼容,如果它被序列化为文件。 但我不想首先将它序列化为文件。

所以回顾一下:保持xslt来自文件,但是xml输入应该是我传递的对象,并且希望在没有任何文件系统交互的情况下生成xml。

您可以将对象序列化为字符串,将字符串加载到XmlDocument ,然后执行转换:

 public string TransformXml(object data, string xslFileName) { XmlSerializer xs = new XmlSerializer(data.GetType()); string xmlString; using (StringWriter swr = new StringWriter()) { xs.Serialize(swr, data); xmlString = swr.ToString(); } var xd = new XmlDocument(); xd.LoadXml(xmlString); var xslt = new System.Xml.Xsl.XslCompiledTransform(); xslt.Load(xslFileName); var stm = new MemoryStream(); xslt.Transform(xd, null, stm); stm.Position = 0; var sr = new StreamReader(stm); return sr.ReadToEnd(); } 

这是一个将对象转换为XDocument的函数(如果您还没有使用XDocument,可以将其更改为XmlDocument)。 当然,如果对象不可序列化,这将抛出exception。

 public static XDocument ConvertToXml(this T o) { StringBuilder builder = new StringBuilder(); StringWriter writer = new StringWriter(builder); XmlSerializer serializer = new XmlSerializer(typeof(T)); serializer.Serialize(writer,o); StringReader reader = new StringReader(builder.ToString()); return XDocument.Load(reader); } 

这是XmlDocument的一个

 public static XmlDocument ConvertToXml(this T o) { StringBuilder builder = new StringBuilder(); StringWriter writer = new StringWriter(builder); XmlSerializer serializer = new XmlSerializer(typeof(T)); serializer.Serialize(writer,o); StringReader reader = new StringReader(builder.ToString()); XmlDocument doc = new XmlDocument(); doc.Load(reader); return doc; } 

未经测试,但您可以使用XPathDocument获取Stream,并且由于XPathDocument实现了IXPathNavigable,因此可以将其用于转换:

  public string TransformXml(Stream xmlFile, string xslFileName) { var doc = new XPathDocument(xmlFile); var xslt = new System.Xml.Xsl.XslCompiledTransform(); xslt.Load(xslFileName); var stm = new MemoryStream(); xslt.Transform(doc, null, stm); stm.Position = 1; var sr = new StreamReader(stm); return sr.ReadToEnd(); } 

看一下这篇文章 ,它描述了创建一个可以导航对象图的属性的XPathNavigator ,它是XPath和XSLT的强大组合。