在本机编程中,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)
{
...
}
答案 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();
}
优化和改进:
答案 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。