因文件名而导致C#XmlException

时间:2012-07-22 08:23:21

标签: c# xml exception

我正在为游戏开发一个启动器/更新程序。 updater从服务器上的xml文件获取它的数据。直到现在我的代码(其中有一些来自其他代码的引用)工作得很好。我测试了它并且它下载了文件就好了,但是,我用来测试它的文件是jpg的。启动器需要下载的实际文件是一系列字符,例如:(e)xP7,iIlM7Q8 =& @ vR2-sv~] 9.5 下载这些时,每次都会抛出异常。我对C#并不擅长,所以我觉得我总是在找到答案的地方寻求帮助。 ;)

我的XML示例:

<theupdates>

<update>
    <version>1.1</version>
    <file>(e}xP7,iIlM7Q8=&@vR2-sv~]9.5.$}t]8</file>
    <path>http://test.m-containers.com/Updates/</path>
  </update>

  <update>
    <version>1.1</version>
    <file>;V;xP,S]PXKr8;{(8HO2NJ H-g;PAo_yTuIV</file>
    <path>http://test.m-containers.com/Updates/</path>
  </update>

<update>
    <version>1.1</version>
    <file>^_HZpQ;Xpi{QS`Ku,}@#B}JYW}Q+;gdO0</file>
    <path>http://test.m-containers.com/Updates/</path>
  </update>

<update>
    <version>1.1</version>
    <file>{G'A4l7O8]~nb(a!mrK5hE)o</file>
    <path>http://test.m-containers.com/Updates/</path>
  </update>

</theupdates>

我的c#代码示例:

    string Root = AppDomain.CurrentDomain.BaseDirectory;

    XDocument serverXml = XDocument.Load(@"http://test.m-containers.com/Updates/Updates.xml");
    foreach (XElement update in serverXml.Descendants("update"))
    {
        string version = update.Element("version").Value;
        string file = update.Element("file").Value;
        string path = update.Element("path").Value;


        string sUrlToReadFileFrom = path + "V" + version + "/" + file;

        string sFilePathToWriteFileTo = Root + "\\Resource\\" + file;

        Uri url = new Uri(sUrlToReadFileFrom);
        System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
        System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse();
        response.Close();

        Int64 iSize = response.ContentLength;

        Int64 iRunningByteTotal = 0;

        using (System.Net.WebClient client = new System.Net.WebClient())
        {
            using (System.IO.Stream streamRemote = client.OpenRead(new Uri(sUrlToReadFileFrom)))
            {
                using (Stream streamLocal = new FileStream(sFilePathToWriteFileTo, FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    int iByteSize = 0;
                    byte[] byteBuffer = new byte[iSize];
                    while ((iByteSize = streamRemote.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
                    {
                        streamLocal.Write(byteBuffer, 0, iByteSize);
                        iRunningByteTotal += iByteSize;

                        double dIndex = (double)(iRunningByteTotal);
                        double dTotal = (double)byteBuffer.Length;
                        double dProgressPercentage = (dIndex / dTotal);
                        int iProgressPercentage = (int)(dProgressPercentage * 100);

                        Downloader.ReportProgress(iProgressPercentage);
                    }

                    streamLocal.Close();
                }

                streamRemote.Close();
            }
        }
    }

有没有办法拥有它,基本上,当它读取这些字符时不会发脾气,或者可能更合理,更好的方法来解决这个问题?

我感谢任何人都可以提供的任何见解。

1 个答案:

答案 0 :(得分:1)

  

有没有办法拥有它,基本上,当它读取这些字符时不会发脾气,或者可能更合理,更好的方法来解决这个问题?

是。使其成为有效的XML文件。这不是有效的XML:

<file>(e}xP7,iIlM7Q8=&@vR2-sv~]9.5.$}t]8</file>

&应为&amp;

我的猜测是服务器没有使用正确的XML API来生成XML - 它只是以愚蠢的方式写出文本。永远不要那样做。在操作XML时,总是使用XML API,因此它会为您处理这类事情。

不应该必须在客户端上解决这个问题 - 为什么阅读这些数据的所有内容都应该包含一个破碎的作者?目前尚不清楚你是否掌控了服务器代码(在这种情况下你应该修改它)或者它是否是第三方代码(在这种情况下你应该非常大声地对它们大喊大叫)。无论哪种方式,当公然不公开某些东西时,只是一个坏主意。