1

我正在尝试实现一些函数,这些函数将使用 XslCompiledTransform 将一个对象转换为另一个对象。

我找到了一些将对象序列化为 XML 字符串并将 XML 字符串反序列化为对象的实现。

另一个函数执行从 object1 到 obejbct2 的 XslCompiledTransform。

为了生成 XSLT 文件,我使用了 Altova MapForce,只加载了序列化对象的 XML 并映射了一些属性。

现在解决问题:

  • 首先我注意到 XslCompiledTransform 不适用于 XSLT 2.0 版。有没有与 XSLT 2.0 一起使用的更新函数?也许一些设置?
  • 其次,在尝试将 XML 反序列化为对象时出现异常:“反序列化 myObject 类型的对象时出错,输入字符串格式不正确。” 我不明白问题出在哪里。有没有人有做这种事情的示例代码?我在谷歌中找到的只是 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();
        }
    }

谢谢分配,

暗里。

4

1 回答 1

3
  • XslCompiledTransform不支持 XSLT 2.0。事实上,.NET Framework 中根本不支持 XSLT 2.0(您可以尝试 .NET 的 Saxon 版本,但请注意,这只是在 IKVM 中运行的 Java 版本)。

  • 根据您的描述,我不明白您为什么要通过 XML 绕道将一个对象转换为另一个对象。为什么不简单地在目标对象中提供一个将输入对象作为参数的构造函数?然后,您可以在该构造函数中编写所有映射。这不仅比序列化、转换和反序列化您的对象高效得多,您还将获得 C# 的类型安全性。

于 2009-08-17T15:06:22.487 回答