C#, Как выполнить живое xslt преобразование на в объекте памяти?

У меня есть функция, которая берет 2 параметра: 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();
}

Я хочу изменить функцию для не принятия файла для XML, но вместо этого просто объекта. Объект точно совместим с xslt, если он был сериализирован в файл. Но я не хочу должным быть сериализировать его в файл сначала.

Таким образом резюмировать: сохраните xslt, прибывающий из файла, но вход xml должен объект я передавать и хотел бы генерировать xml извне любое взаимодействие файловой системы.

8
задан JL. 30 March 2010 в 20:56
поделиться

4 ответа

Вы можете сериализовать объект в string, загрузите строку в 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();
}
9
ответ дан 5 December 2019 в 12:57
поделиться

Не тестировалось, но вы можете использовать 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(); 
  } 
1
ответ дан 5 December 2019 в 12:57
поделиться

Взгляните на эту статью , в которой описывается создание XPathNavigator , который может перемещаться по свойствам графа объекта , который представляет собой довольно мощную комбинацию XPath и XSLT.

0
ответ дан 5 December 2019 в 12:57
поделиться

Вот функция, которая превратит объект в XDocument (вы можете изменить его на XmlDocument, если вы еще не используете XDocument). Конечно, это вызовет исключения, если объект не сериализуемый.

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);
}

и вот один для 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;
}
3
ответ дан 5 December 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: