2009-09-04 3 views

ответ

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

Его не самый эффективный механизм памяти, но он будет достаточным для большинства потребностей. Аналогичный подход будет использовать MemoryStream вместо StringWriter, но его немного беспорядочно по сравнению.

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 является XPathDocument, который уже был инициализирован от XmlReader.)

2

Немного лучше форма ответа Дэвида М. Андерсона ниже: это не страдают от потенциальных утечек ресурсов; в противном случае это то же самое.

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