C# XslCompiledTransform输出为XPathDocument

C# XslCompiledTransform输出为XPathDocument,c#,xml,xslcompiledtransform,xpathdocument,C#,Xml,Xslcompiledtransform,Xpathdocument,我正在尝试使用XslCompiledTransform,并将输出用作XPathDocument 有什么想法吗?根据StringWriter将转换发送到XmlTextWriter。然后通过从StringWriter中检索XML字符串来实例XPathDocument var sw = new StringWriter(); var xtw = new XmlTextWriter(sw); myTransform.Transform(myXml, xtw); var xpd = new XPath

我正在尝试使用XslCompiledTransform,并将输出用作XPathDocument


有什么想法吗?

根据
StringWriter
将转换发送到
XmlTextWriter
。然后通过从
StringWriter
中检索XML字符串来实例
XPathDocument

var sw = new StringWriter();
var xtw = new XmlTextWriter(sw);

myTransform.Transform(myXml, xtw);

var xpd = new XPathDocument(sw.ToString());

它不是内存效率最高的机制,但足以满足大多数需求。类似的方法是使用
MemoryStream
而不是
StringWriter
,但相比之下有点混乱。

基于
StringWriter
将转换发送到
XmlTextWriter
。然后通过从
StringWriter
中检索XML字符串来实例
XPathDocument

var sw = new StringWriter();
var xtw = new XmlTextWriter(sw);

myTransform.Transform(myXml, xtw);

var xpd = new XPathDocument(sw.ToString());

它不是内存效率最高的机制,但足以满足大多数需求。类似的方法是使用
MemoryStream
而不是
StringWriter
,但相比之下这有点混乱。

琼斯先生的回答对我很有帮助,但我发现最后一行行不通。我最终做了这样的事:

XslCompiledTransform xsl = new XslCompiledTransform();
xsl.Load(filePath);
StringWriter stringWriter = new StringWriter();
XmlWriter xmlWriter = XmlTextWriter.Create(stringWriter);
xsl.Transform(xPathDoc, xmlWriter);
String newXml = stringWriter.ToString();
StringReader stringReader = new StringReader(newXml);
xPathDoc = new XPathDocument(stringReader);

(这里,xPathDoc是一个已经从XmlReader初始化的XPathDocument。)

琼斯先生的回答对我很有帮助,但我发现最后一行行不通。我最终做了这样的事:

XslCompiledTransform xsl = new XslCompiledTransform();
xsl.Load(filePath);
StringWriter stringWriter = new StringWriter();
XmlWriter xmlWriter = XmlTextWriter.Create(stringWriter);
xsl.Transform(xPathDoc, xmlWriter);
String newXml = stringWriter.ToString();
StringReader stringReader = new StringReader(newXml);
xPathDoc = new XPathDocument(stringReader);

(这里,xPathDoc是一个已经从XmlReader初始化的XPathDocument。)

David M.Anderson的回答的一个稍微好一点的形式如下:它没有潜在的资源泄漏;否则也一样

private static XPathDocument TransformToXPathDocument(string styleSheetPath,
                                                      IXPathNavigable xPathDoc)
{
    var xsl = new XslCompiledTransform();
    xsl.Load(styleSheetPath);
    using(var stringWriter = new StringWriter())
    {
        using(XmlWriter xmlWriter = XmlWriter.Create(stringWriter))
        {
            xsl.Transform(xPathDoc, xmlWriter);
        }
        using(var reader = new StringReader(stringWriter.ToString()))
        {
            return new XPathDocument(reader);
        }
    }
}

大卫·M·安德森(David M.Anderson)回答的一个稍微好一点的形式如下:它没有潜在的资源泄漏;否则也一样

private static XPathDocument TransformToXPathDocument(string styleSheetPath,
                                                      IXPathNavigable xPathDoc)
{
    var xsl = new XslCompiledTransform();
    xsl.Load(styleSheetPath);
    using(var stringWriter = new StringWriter())
    {
        using(XmlWriter xmlWriter = XmlWriter.Create(stringWriter))
        {
            xsl.Transform(xPathDoc, xmlWriter);
        }
        using(var reader = new StringReader(stringWriter.ToString()))
        {
            return new XPathDocument(reader);
        }
    }
}