2010-06-08 41 views
1

我在使用XElementXslCompiledTransform的組合時遇到了一些問題。我已經把我在下面使用的示例代碼。如果我使用GetXmlDocumentXml()方法得到我的輸入XML,它可以正常工作。在國家啓動XElement和XslCompiledTransform存在問題

令牌文本會導致一個無效的XML文檔中:如果我使用GetXElementXml()方法,而不是,我打電話的XslComiledTransformTransform方法時得到一個InvalidOperationException。如果要編寫一個XML片段,請確保ConformanceLevel設置設置爲ConformanceLevel.Fragment或ConformanceLevel.Auto。

XElementXmlDocument上的CreateNavigator方法返回XPathNavigator。什麼額外的東西是XmlDocument這樣做這一切工作,我怎麼能做到這一點與XElement?我只是在做一些瘋狂的事情嗎?

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

回答

3

哦,那很容易。解決方案是將XElement包裝在XDocument對象中。問題解決了!