Проблема с XElement и XslCompiledTransform - PullRequest
1 голос
/ 08 июня 2010

У меня возникли проблемы с использованием комбинации XElement и XslCompiledTransform.Я поместил пример кода, который я использую ниже.Если я получу свой входной XML с использованием метода GetXmlDocumentXml(), он будет работать нормально.Если вместо этого я использую метод GetXElementXml(), я получу InvalidOperationException при вызове метода Transform для XslComiledTransform:

Текст токена в состоянии Start приведет к неверному документу XML.Убедитесь, что для параметра ConformanceLevel установлено значение ConformanceLevel.Fragment или ConformanceLevel.Auto, если вы хотите записать фрагмент XML .

Метод CreateNavigator для обоих типов XElement и XmlDocument возвращает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();
}

1 Ответ

3 голосов
/ 08 июня 2010

О, это было легко.Решением было обернуть XElement в XDocument объект.Проблема решена!

...