2006年06月18日
川俣晶の縁側ソフトウェア技術雑記 total 4515 count

.NET Framework 1.1→2.0非互換性: XmlDocument.LoadメソッドのURL解釈が異なる

Written By: 川俣 晶連絡先

 XmlDocument.Loadメソッドにローカルファイルのファイル名を直接与えたとき、

たまたまURLエンコードとして解釈できる文字列が含まれていた場合、

.NET Framework 1.1と2.0では解釈が異なる場合があります。

 これにより、1.1では発見できなかったファイルを、2.0では発見できる場合が生

じます。

検証ソース §

 .NET Framework 1.1で実行するとTrace.AssertはPassします。

 .NET Framework 2.0で実行するとTrace.AssertはFailします。

 (このままでは実行できません。メソッドを呼び出す適当なメインルーチンが必要です)

using System;

using System.Diagnostics;

using System.IO;

using System.Xml;

namespace TestLTEngine

{

    public class TestDomLoadFromFile

    {

        public static void TestFromFile1()

        {

            const string testDirectory = "c:\\testdir$";

            if( Directory.Exists(testDirectory) )

            {

                Directory.Delete(testDirectory,true);

            }

            Directory.CreateDirectory(testDirectory);

            try

            {

                const string filename = @"c:\%AB.xml";

                string targetFullPath = Path.Combine(testDirectory,filename);

                XmlDocument doc1 = new XmlDocument();

                doc1.LoadXml("<a>test</a>");

                doc1.Save(targetFullPath);

                XmlDocument doc2 = DOMLoad.FromFile(targetFullPath);

                Trace.Assert( doc2.OuterXml == "<a>test</a>" );

                bool flag1 = false;

                XmlDocument doc3 = new XmlDocument();

                try

                {

                    // DOMLoad.FromFileではなく、Loadを使うとFileNotFoundExceptionが投げられる

                    // ということを示しておくためのテスト。2つのメソッドの役割の違いを示す

                    doc3.Load(targetFullPath);

                }

                catch( FileNotFoundException )

                {

                    flag1 = true;

                }

                Trace.Assert( flag1 == true );

            }

            finally

            {

                Directory.Delete(testDirectory,true);

            }

        }

        public static void RunSuite()

        {

            TestFromFile1();

        }

    }

}