2010-06-08 6 views
1

Je rencontre des problèmes en utilisant une combinaison de XElement et XslCompiledTransform. J'ai mis l'exemple de code que j'utilise ci-dessous. Si je reçois mon entrée XML en utilisant la méthode GetXmlDocumentXml(), cela fonctionne très bien. Si j'utilise la méthode à la place GetXElementXml(), je reçois un InvalidOperationException lorsque vous appelez la méthode Transform de XslComiledTransform:Problème avec XElement et XslCompiledTransform

texte Token dans l'état de départ entraînerait un document XML non valide. Assurez-vous que le paramètre ConformanceLevel est défini sur ConformanceLevel.Fragment ou ConformanceLevel.Auto si vous souhaitez écrire un fragment XML.

La méthode CreateNavigator à la fois sur XElement et XmlDocument renvoie un XPathNavigator. Qu'est-ce que les choses supplémentaires est XmlDocument ce faisant tout cela fonctionne, et comment puis-je faire la même chose avec XElement? Est-ce que je fais juste quelque chose de fou?

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

Répondre

3

Oh, c'était facile. La solution consistait à envelopper le XElement dans un objet XDocument. Problème résolu!