在反序列化之前,C#检查XML文件是否未损坏

时间:2013-04-01 10:50:12

标签: c# visual-studio-2010 serialization xml-serialization filestream

我在互联网上找不到任何问题。 我反序列化播放列表的数据。

他是我的代码:

using (var fs = new FileStream("playlist.xml", FileMode.OpenOrCreate))
{
 XmlSerializer xml = new XmlSerializer(typeof(ObservableCollection<Playlist>));
 if (fs.Length > 0)
  pl = (ObservableCollection<Playlist>)xml.Deserialize(fs);
 else
  pl = new ObservableCollection<Playlist>();
}

结果是XML:

    <?xml version="1.0"?>
    <ArrayOfPlaylist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <Playlist>
        <Name>Playlist1</Name>
          <List>
             <Media>
                <path>C:\Users\Tchiko\Videos\Suit Tie (Official Lyric Video).mp4</path>
                <name>Suit Tie (Official Lyric Video).mp4</name>
                <type>Video</type>
             </Media>
         </List>
     </Playlist>
     <Playlist>
        <Name>Hip hop</Name>
          <List>
            <Media>
              <path>C:\Users\Tchiko\Videos\Suit Tie (Official Lyric Video).mp4</path>
              <name>Suit Tie (Official Lyric Video).mp4</name>
              <type>Video</type>
            </Media>
         </List>
      </Playlist>
</ArrayOfPlaylist>

在加载播放列表之前,我想检查用户是否手动损坏了文件。 我需要检查XML格式是否正常,以避免在反序列化后发生冲突。

编辑: 版本以避免错误格式的错误:

        using (var fs = new FileStream("playlist.xml", FileMode.OpenOrCreate))
        {
            try
            {
                XmlSerializer xml = new XmlSerializer(typeof(ObservableCollection<Playlist>));
                if (fs.Length > 0)
                    pl = (ObservableCollection<Playlist>)xml.Deserialize(fs);
                else
                    pl = new ObservableCollection<Playlist>();
            }
            catch (Exception ex)
            {  
                pl = new ObservableCollection<Playlist>();
            }
        }

感谢帮助

1 个答案:

答案 0 :(得分:0)

为确保XML有效性,您需要定义XML Schema。 XML Schema声明XML中允许的标记,顺序和值的类型。

Here是一篇关于如何针对Schema验证XML的文章。

如果您的XML格式不正确(例如,用户没有关闭标记或类似的东西),反序列化将失败,您将获得InvalidOperationException更多详细信息{ {1}}。请参阅MSDN上的XmlSerializer.Deserialize()