1

XslCompiledTransform を使用して、あるオブジェクトを別のオブジェクトに変換する関数をいくつか実装しようとしています。

オブジェクトを XML 文字列にシリアライズし、XML 文字列をオブジェクトにデシリアライズするための実装をいくつか見つけました。

別の関数は、object1 から obejbct2 への XslCompiledTransform を実行します。

XSLT ファイルを生成するために、Altova MapForce を使用し、シリアル化されたオブジェクトの XML をロードし、いくつかの属性をマップしました。

問題は次のとおりです。

  • 最初に、XslCompiledTransform が XSLT バージョン 2.0 で動作しないことに気付きました。XSLT 2.0 で動作する新しい関数はありますか? 多分いくつかの設定?
  • 次に、XML をオブジェクトにデシリアライズしようとすると、例外が発生します。どこに問題があるのか​​ わかりません。そのようなことを行うサンプルコードはありますか? 私がグーグルで見つけたのは、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
  • XslCompiledTransformXSLT2.0をサポートしていません。実際、XSLT 2.0は.NETFramework内ではまったくサポートされていません(.NET用のSaxonバージョンを試すこともできますが、これはIKVM内で実行されているJavaバージョンにすぎないことに注意してください)。

  • あなたの説明から、あるオブジェクトを別のオブジェクトに変換するためにXMLを経由して迂回している理由がわかりませんでした。入力オブジェクトをパラメーターとして受け取るコンストラクターをターゲットオブジェクトに単純に提供してみませんか?次に、そのコンストラクター内のすべてのマッピングをコーディングできます。これは、オブジェクトのシリアル化、変換、逆シリアル化よりもはるかに効率的であるだけでなく、C#の型安全性も得られます。

于 2009-08-17T15:06:22.487 に答える