Problema con XELEMEN y XSLCompiledTransform
-
24-10-2019 - |
Pregunta
Tengo algunos problemas para usar una combinación de XElement
y XslCompiledTransform
. Puse el código de muestra que estoy usando a continuación. Si obtengo mi entrada XML usando el GetXmlDocumentXml()
Método, funciona bien. Si uso el GetXElementXml()
Método en su lugar, obtengo un InvalidOperationException
Al llamar al Transform
método de XslComiledTransform
:
El texto del token en el inicio del estado daría como resultado un documento XML inválido. Asegúrese de que la configuración conformancelevel esté configurada para conformarelevel.fragment o conformancelevel.auto si desea escribir un fragmento XML.
los CreateNavigator
método en ambos XElement
y XmlDocument
Devuelve un XPathNavigator
. Qué cosas adicionales son XmlDocument
Al hacerlo todo esto funciona, y ¿cómo puedo hacer lo mismo con XElement
? ¿Estoy haciendo algo loco?
static void Main(string[] args)
{
XslCompiledTransform stylesheet = GetStylesheet(); // not shown for brevity
IXPathNavigable input = this.GetXElementXml();
using (MemoryStream ms = this.TransformXml(input, stylesheet))
{
XmlReader xr = XmlReader.Create(ms);
xr.MoveToContent();
}
}
private MemoryStream TransformXml(
IXPathNavigable xml,
XslCompiledTransform stylesheet)
{
MemoryStream transformed = new MemoryStream();
XmlWriter writer = XmlWriter.Create(transformed);
stylesheet.Transform(xml, null, writer);
transformed.Position = 0;
return transformed;
}
private IXPathNavigable GetXElementXml()
{
var xml = new XElement("x", new XElement("y", "sds"));
return xml.CreateNavigator();
}
private IXPathNavigable GetXmlDocumentXml()
{
var xml = new XmlDocument();
xml.LoadXml("<x><y>sds</y></x>");
return xml.CreateNavigator();
}
Solución
Oh, eso fue fácil. La solución era envolver el XElement
en un XDocument
objeto. ¡Problema resuelto!