.NET XML:什么是.NET等效的XmlDocument.TransformNode?

Ian*_*oyd 2 .net c# xml

在本机编程中,IXMLDOMDocument2对象有一个tranformNode()方法:

public BSTR transformNode(IXMLDOMNode stylesheet);
Run Code Online (Sandbox Code Playgroud)

所以最后我可以使用以下方法转换XML文档:

public string TransformDocument(IXMLDOMDocument2 doc, IXMLDOMDocument2 stylesheet)
{
   return doc.TransformNode(stylesheet);
}
Run Code Online (Sandbox Code Playgroud)

我正试图找到管理的等价物.我已经发现了XmlDocument对象:

public string TransformDocument(XmlDocument doc, XmlDocument stylesheet)
{
   //return doc.TransformNode(stylesheet); //TransformNode not supported
}
Run Code Online (Sandbox Code Playgroud)

那么转换xml的管理方式是什么?

我偶然发现了已弃用的 XslTransform对象,但18个重载中没有一个采用xml文档或xml样式表.

替换微软表示满口:System.Xml.Xsl.XslCompiledTransform.但就像它被弃用的表兄弟一样,XslCompiledTransform的14个重载都没有在输入参数中使用xml.

那么在C#.NET 2.0中转换xml的公认方法是什么?

换句话说:完成以下帮助方法:

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

回答

瓦卡斯得到了答案.这是另一个非常相似的解决方案:

/// <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();   
}
Run Code Online (Sandbox Code Playgroud)

注意:如果你是一个表演者,你可能想要创建一个重载来传递预编译的变换,如果你要转换多次.

public static string Transform(XmlDocument doc, XslCompiledTransform stylesheet)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

waq*_*qas 6

这些函数将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();
}
Run Code Online (Sandbox Code Playgroud)

优化和改进:

  • 如果您多次使用它,请缓存已编译的样式表.
  • 将XSL直接加载到XslCompiledTransform中,而不是首先构建XmlDocument.
  • 使用XmlNode而不是XmlDocument使函数更通用.