Problema con XElement e XslCompiledTransform
-
24-10-2019 - |
Domanda
Sto avendo qualche problema utilizzando una combinazione di XElement
e XslCompiledTransform
. Ho messo il codice di esempio che sto usando qui di seguito. Se ottengo la mia XML di input utilizzando il metodo GetXmlDocumentXml()
, funziona benissimo. Se uso il metodo GetXElementXml()
invece, ottengo un InvalidOperationException
quando si chiama il metodo di Transform
XslComiledTransform
:
Testo simbolici in stato di avvio si tradurrebbe in un documento XML non valido. Assicurarsi che l'impostazione è impostata su ConformanceLevel ConformanceLevel.Fragment o ConformanceLevel.Auto se si desidera scrivere un XML frammento .
Il metodo CreateNavigator
su entrambi i XElement
e XmlDocument
restituisce un XPathNavigator
. Che roba in più è XmlDocument
così facendo questo tutte le opere, e come posso fare lo stesso con XElement
? Sto solo facendo una cosa folle?
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();
}
Soluzione
Oh, che era facile. La soluzione era quella di avvolgere il XElement
in un oggetto XDocument
. Problema risolto!