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

时间:2009-01-22 18:23:19

标签: c# .net xml

在本机编程中,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样式表。

替换微软表示满口是: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#
}

答案

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 个答案:

答案 0 :(得分: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();
}

优化和改进:

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

答案 1 :(得分:0)

首先加载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);

答案 2 :(得分:0)

怎么样:

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

答案 3 :(得分:0)

我在生产代码中使用的解决方案看起来类似于Wolf,但是使用XPathDocument(可以从包含XML的字符串初始化)调用XslCompiledTransform.Transform方法,并使用XmlWriter将输出定向到StringBuilder。