Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#如何在内存对象上执行实时xslt转换?_C#_Xml_Xslt - Fatal编程技术网

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

C#如何在内存对象上执行实时xslt转换?,c#,xml,xslt,C#,Xml,Xslt,我有一个函数,它接受两个参数:1=XML文件,2=XSLT文件,然后执行转换并返回结果HTML 以下是函数: /// <summary> /// Will apply an XSLT style to any XML file and return the rendered HTML. /// </summary> /// <param name="xmlFileName"> /// The file name of the XML document. ///

我有一个函数,它接受两个参数:1=XML文件,2=XSLT文件,然后执行转换并返回结果HTML

以下是函数:

/// <summary>
/// Will apply an XSLT style to any XML file and return the rendered HTML.
/// </summary>
/// <param name="xmlFileName">
/// The file name of the XML document.
/// </param>
/// <param name="xslFileName">
/// The file name of the XSL document.
/// </param>
/// <returns>
/// The rendered HTML.
/// </returns>
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();
}
//
///将XSLT样式应用于任何XML文件并返回呈现的HTML。
/// 
/// 
///XML文档的文件名。
/// 
/// 
///XSL文档的文件名。
/// 
/// 
///呈现的HTML。
/// 
公共字符串转换XML(字符串xmlFileName、字符串xslFileName)
{
var xtr=新的XmlTextReader(xmlFileName)
{
WhitespaceHandling=WhitespaceHandling.None
};
var xd=新的XmlDocument();
xd.载荷(xtr);
var xslt=new System.Xml.Xsl.xslcomiledTransform();
Load(xslt文件名);
var stm=新内存流();
Transform(xd,null,stm);
stm.Position=1;
var sr=新的StreamReader(stm);
xtr.Close();
返回sr.ReadToEnd();
}
我想将函数更改为不接受XML文件,而只接受对象。 如果将对象序列化为文件,则该对象与xslt完全兼容。但我不想先把它序列化成文件


概括地说:保持xslt来自一个文件,但是xml输入应该是一个我传递的对象,并且希望在没有任何文件系统交互的情况下从中生成xml

这里有一个函数可以将对象转换为XDocument(如果您还没有使用XDocument,可以将其更改为XmlDocument)。当然,如果对象不可序列化,这将引发异常

public static XDocument ConvertToXml<T>(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);
}
publicstaticxdocumentconvertoxml(这个T-o)
{
StringBuilder=新的StringBuilder();
StringWriter编写器=新的StringWriter(生成器);
XmlSerializer serializer=新的XmlSerializer(typeof(T));
serializer.Serialize(writer,o);
StringReader=新的StringReader(builder.ToString());
返回XDocument.Load(读卡器);
}
这是XmlDocument的一个

public static XmlDocument ConvertToXml<T>(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;
}
publicstaticxmldocumentconverttoxml(此文件)
{
StringBuilder=新的StringBuilder();
StringWriter编写器=新的StringWriter(生成器);
XmlSerializer serializer=新的XmlSerializer(typeof(T));
serializer.Serialize(writer,o);
StringReader=新的StringReader(builder.ToString());
XmlDocument doc=新的XmlDocument();
文件加载(读卡器);
退货单;
}

未测试,但您可以使用XPathDocument获取流,并且由于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(); 
  } 

您可以将对象序列化为字符串,将字符串加载到
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();
}

看看哪个描述了创建一个能够导航对象图属性的
XPathNavigator
,它是XPath和XSLT的强大组合。

XslCompiledTransform需要一个XmlDocument,而不是XDDocument。。。否则,这与我的想法大致相同;)我刚刚使用了这个,但必须指出,我需要将
位置更改为
=0
。否则,它将按预期工作。=)