在本机编程中,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)
这些函数将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)
优化和改进: