sortie XslCompiledTransform comme XPathDocument
-
21-09-2019 - |
Question
Je suis en train d'utiliser un XslCompiledTransform et utiliser la sortie comme XPathDocument.
Des idées?
La solution
Envoyez le fichier de transformation à un XmlTextWriter
basé sur un StringWriter
. Ensuite, par exemple la XPathDocument
par retreiving 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());
Son pas le plus mécanisme efficace de la mémoire, mais sera suffisant pour la plupart des besoins. Une approche similaire serait d'utiliser un MemoryStream
au lieu d'un StringWriter
mais son un peu désordonné par comparaison.
Autres conseils
Monsieur. La réponse de Jones a été très utile pour moi, mais je l'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.)
Une forme légèrement meilleure de la réponse de David M. Anderson est ci-dessous: il ne souffre pas de fuites de ressources potentielles; sinon il est le même.
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);
}
}
}