2009-09-04 5 views

Répondre

2

Envoie la transformation à un XmlTextWriter basé sur un StringWriter. Ensuite, instance le XPathDocument en récupérant la chaîne XML à partir du StringWriter.

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

myTransform.Transform(myXml, xtw); 

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

Ce n'est pas le mécanisme le plus efficace en termes de mémoire, mais il convient à la plupart des besoins. Une approche similaire serait d'utiliser un MemoryStream au lieu d'un StringWriter mais c'est un peu brouillon par comparaison.

3

La réponse de M. Jones m'a été très utile, mais j'ai trouvé que la dernière ligne ne fonctionnait pas. J'ai fini par faire ceci:

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

(Ici, xPathDoc est un XPathDocument qui a déjà été initialisé à partir d'un XmlReader.)

2

Une forme légèrement meilleure de la réponse de David M. Anderson est ci-dessous: il ne souffrir de fuites de ressources potentielles; sinon c'est pareil.

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