1

XslCompiledTransform を使用しようとしており、出力を XPathDocument として使用しています。

何か案は?

4

3 に答える 3

3

ジョーンズ氏の回答は私にとって非常に役に立ちましたが、最後の行が機能しないことがわかりました。私はこれをやってしまった:

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 です。)

于 2010-03-31T02:34:08.853 に答える
2

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);
        }
    }
}
于 2010-03-31T02:45:40.590 に答える
2

XmlTextWriterに基づいて変換を に送信しStringWriterます。次に、XPathDocumentから XML 文字列を取得して をインスタンス化しますStringWriter

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

myTransform.Transform(myXml, xtw);

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

これは最もメモリ効率の高いメカニズムではありませんが、ほとんどのニーズには十分対応できます。同様のアプローチは a のMemoryStream代わりに a を使用することになりますStringWriterが、比較すると少し面倒です。

于 2009-09-04T14:17:16.693 に答える