.NET XML: Что такое .NET-эквивалент XmlDocument.TransformNode? - PullRequest
2 голосов
/ 22 января 2009

В нативном программировании объект IXMLDOMDocument2 имел метод tranformNode():

public BSTR transformNode(IXMLDOMNode stylesheet);

Таким образом, в конце я мог преобразовать XML-документ, используя:

public string TransformDocument(IXMLDOMDocument2 doc, IXMLDOMDocument2 stylesheet)
{
   return doc.TransformNode(stylesheet);
}

Я пытаюсь найти управляемый эквивалент. Я уже обнаружил XmlDocument объект:

public string TransformDocument(XmlDocument doc, XmlDocument stylesheet)
{
   //return doc.TransformNode(stylesheet); //TransformNode not supported
}

Так что же такое управляемый способ преобразования xml?

Я наткнулся на устаревший объект XslTransform , но ни одна из 18 перегрузок не принимает документ XML или таблицу стилей XML.

Microsoft указывает на замену: System.Xml.Xsl.XslCompiledTransform . Но, как и его устаревший двоюродный брат, ни одна из 14 перегрузок XslCompiledTransform не принимает XML во входном параметре.

Так, каков принятый метод для преобразования xml в C # .NET 2.0?

Другими словами: выполните следующий вспомогательный метод:

public string TransformDocument(XmlDocument doc, XmlDocument stylesheet)
{
   //todo: figure out how to transform xml in C#
}

Ответ

Waqas получил ответ. Вот еще одно, очень похожее решение:

/// <summary>
/// This method simulates the XMLDOMDocument.TransformNode method
/// </summary>
/// <param name="doc">XML document to be transformed</param>
/// <param name="stylesheet">The stylesheet to transform with</param>
/// <returns></returns>
public static string Transform(XmlDocument doc, XmlDocument stylesheet)
{
    XslCompiledTransform transform = new XslCompiledTransform();
    transform.Load(stylesheet); // compiled stylesheet

    System.IO.StringWriter writer = new System.IO.StringWriter();
    transform.Transform(doc, XmlWriter.Create(writer));

    return writer.ToString();   
}

Примечание: Если вы настроены на повышение производительности, вам может потребоваться создать перегрузку для передачи предварительно скомпилированного преобразования, если вы собираетесь преобразовать более одного раза.

public static string Transform(XmlDocument doc, XslCompiledTransform stylesheet)
{
   ...
}

Ответы [ 4 ]

6 голосов
/ 22 января 2009

Функции принимают объекты IXPathNavigable в качестве входных данных (а классы XmlDoucment / XmlNode реализуют IXPathNavigable).

Вот как это будет работать:

public string TransformDocument(XmlDocument doc, XmlDocument stylesheet)
{
   XslCompiledTransform transform = new XslCompiledTransform();
   transform.Load(stylesheet); // compiled stylesheet
   System.IO.StringWriter writer = new System.IO.StringWriter();
   transform.Transform(doc, null, writer);
   return writer.ToString();
}

Оптимизации и улучшения:

  • Кэшируйте скомпилированную таблицу стилей, если вы используете ее более одного раза.
  • Загрузите XSL непосредственно в XslCompiledTransform вместо того, чтобы сначала создавать XmlDocument.
  • Используйте XmlNode вместо XmlDocument, чтобы сделать функцию более общей.
0 голосов
/ 22 января 2009

Решение, которое я использую в производственном коде, похоже на Wolf, но вызывает метод XslCompiledTransform.Transform с XPathDocument (инициализируемый из строки, содержащей XML) и XmlWriter, который направляет вывод в StringBuilder.

0 голосов
/ 22 января 2009

Как насчет:

static void Main(string[] args)
{
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(pathToXmlOrXMLString);

    XslCompiledTransform xsl = new XslCompiledTransform();
    xsl.Load(pathToXsl);

    string result = TransformDocument(doc, xsl);

}

static string TransformDocument(XmlDocument doc, XslCompiledTransform xsl)
{    
    StringBuilder sb = new StringBuilder();
    using (StringWriter sw = new StringWriter(sb))
    {
        xsl.Transform(doc.CreateNavigator(), null, sw);
    }

    return sb.ToString();
}
0 голосов
/ 22 января 2009

Сначала загрузите XSL и документ XML.

XmlDocument xsldoc = new XmlDocument();
xsldoc.Load(xslfile);

XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(xmlfile);

Загрузите xsl в объект преобразования.

XslCompiledTransform xsldoctrans = new XslCompiledTransform();
xsldoctrans.Load(xsldoc);

Преобразуйте его в поток памяти, который можно прочитать.

MemoryStream ms = new MemoryStream();
xsldoctrans.Transform(xmldoc, (XsltArgumentList)null, ms);

Затем получите преобразованные данные:

byte[] bTransformeddata = ms.ToArray();
string sTransformeddata = xsldoctrans.OutputSettings.Encoding.GetString(bTransformeddata);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...