XslCompiledTransform и сериализация

Я пытаюсь реализовать некоторые функции, которые будут преобразовывать один объект в другой с помощью XslCompiledTransform.

Я нашел несколько реализаций для сериализации объекта в XML-строку и де-сериализации XML-строки в объект.

Другая функция выполняет XslCompiledTransform от object1 до obejbct2.

Для создания файла XSLT я использовал Altova MapForce, просто загрузил XML сериализованных объектов и сопоставил некоторые атрибуты.

Теперь о проблемах:

  • Сначала я заметил, что XslCompiledTransform не работает с XSLT версии 2.0. есть ли какие-нибудь новые функции, которые работают с XSLT 2.0? может какие настройки?
  • во-вторых, я получаю исключение при попытке DeSerialize XML для объекта: «Произошла ошибка десериализации объекта типа myObject. Входная строка была в неправильном формате». Я не понимаю, в чем проблема. У кого-нибудь есть образец кода, который делает такое? все, что я нахожу в Google, - это преобразования HTML-кода, а не объекты.

Вот функции:

private static string runXSLT(string xsltFile, string inputXML)
        {
            XmlDocument XmlDoc = new XmlDocument();

            // Load the style sheet.
            XslCompiledTransform xslt = new XslCompiledTransform(true);
            xslt.Load(xsltFile);

            StringReader StrReader = new StringReader(inputXML);
            XmlTextReader XmlReader = new XmlTextReader(StrReader);


            //Create an XmlTextWriter which outputs to memory stream
            Stream stream = new MemoryStream();
            XmlWriter writer = new XmlTextWriter(stream, Encoding.UTF8);

            // Execute the transform and output the results to a file.
            xslt.Transform(XmlReader, writer);

            stream.Position = 0;
            XmlDoc.Load(stream);
            return XmlDoc.InnerXml;
        }

public static string SerializeAnObject(object AnObject)
        {
            XmlDocument XmlDoc = new XmlDocument();
            DataContractSerializer xmlDataContractSerializer = new DataContractSerializer(AnObject.GetType());
            MemoryStream MemStream = new MemoryStream();
            try
            {
                xmlDataContractSerializer.WriteObject(MemStream, AnObject);
                MemStream.Position = 0;
                XmlDoc.Load(MemStream);
                return XmlDoc.InnerXml;
            }
            finally
            {
                MemStream.Close();
            }

        }

    public static Object DeSerializeAnObject(string XmlOfAnObject, Type ObjectType)
    {
        StringReader StrReader = new StringReader(XmlOfAnObject);
        DataContractSerializer xmlDataContractSerializer = new DataContractSerializer(ObjectType);
        XmlTextReader XmlReader = new XmlTextReader(StrReader);
        try
        {
            Object AnObject = xmlDataContractSerializer.ReadObject(XmlReader);
            return AnObject;
        }
        finally
        {
            XmlReader.Close();
            StrReader.Close();
        }
    }

Спасибо большое,

Омри.


person Community    schedule 17.08.2009    source источник


Ответы (1)


  • XslCompiledTransform не поддерживает XSLT 2.0. Фактически, XSLT 2.0 вообще не поддерживается в .NET Framework (вы можете попробовать версию Saxon для .NET, но имейте в виду, что это просто версия Java, работающая внутри IKVM).

  • Из вашего описания я не понял, почему вы делаете обходной путь через XML, чтобы преобразовать один объект в другой. Почему бы вам просто не предоставить конструктор в вашем целевом объекте, который принимает ваш входной объект в качестве параметра? Затем вы можете закодировать все сопоставления внутри этого конструктора. Это не только намного эффективнее, чем сериализация, преобразование и десериализация ваших объектов, вы также получите безопасность типов C #.

person Dirk Vollmar    schedule 17.08.2009
comment
+1 за использование конструктора для преобразования исходного класса в новый класс - person Dan McClain; 17.08.2009
comment
Цель использования XSL-преобразования - выполнить сопоставление одного объекта с другим без жесткого кодирования, поэтому я могу изменить сопоставленные свойства без компиляции проекта. На самом деле я создаю это для сопоставления данных между веб-службами. Я получаю данные A из WS 1 и данные B из WS 2, теперь мне нужно создать новый класс для отправки в WS 3. Класс ответа построен из объекта A + B. Теперь, если WS 1 вернет в будущем другой объект A (A.name изменено на A.firstName) Я могу изменить сопоставление в файле XSLT и сделать это без повторной компиляции проекта. Спасибо за быстрый ответ! - person ; 17.08.2009