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();
}
¿Fue útil?

Solución

Oh, eso fue fácil. La solución era envolver el XElement en un XDocument objeto. ¡Problema resuelto!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top