2016-01-27 3 views
1

Мне нужна помощь, чтобы указать, что я делаю неправильно здесь. Я искал SO и пробовал разные способы загрузить этот XML, и я просто не мог понять, что могло бы вызвать эту ошибку:десериализовать XML-документ для коллекции объектов C#

System.InvalidOperationException: В документе XML есть ошибка (1, 1). ---> System.Xml.XmlException: данные на корневом уровне недействительны. Строка 1, позиция 1.

<?xml version="1.0" encoding="utf-8"?> 
<folderlist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<foldersetting> 
    <id>1</id> 
    <source> 
    <path>\\USApps2\AVL\Attachments</path> 
    <datelastread>2016-01-25T10:51:12.6030162-08:00</datelastread> 
    <filter> 
     <owner>US\</owner> 
     <filetype>*</filetype> 
    </filter> 
    </source> 
    <destination> 
    <path>E:\UserData\AVL</path> 
    <overwrite>false</overwrite> 
    </destination> 
</foldersetting> 
<foldersetting> 
    <id>2</id> 
    <source> 
    <path>\\TWAVLSVR\AVL\Attachments</path> 
    <datelastread>2016-01-22T10:51:12.6030162-08:00</datelastread> 
    <filter> 
     <owner>TW\</owner> 
     <filetype>PDF</filetype> 
    </filter> 
    </source> 
    <destination> 
    <path>E:\UserData\AVL</path> 
    <overwrite>false</overwrite> 
    </destination> 
</foldersetting> 
<foldersetting> 
    <id>3</id> 
    <source> 
    <path>E:\UserData\AVL</path> 
    <datelastread>2016-01-22T10:51:12.6030162-08:00</datelastread> 
    <filter> 
     <owner>US\</owner> 
     <filetype>*</filetype> 
    </filter> 
    </source> 
    <destination> 
    <path>E:\UserData\AVL\Web</path> 
    <overwrite>false</overwrite> 
    </destination> 
</foldersetting> 
</folderlist> 

Вот мое определение класса:

[Serializable()] 
public class Filter 
{ 
    [XmlElement("owner")] 
    public string Owner {get; set;} 

    [XmlElement("filetype")] 
    public string FileType { get; set; } 
} 

[Serializable()] 
public class SourceFolder 
{ 
    [XmlElement("path")] 
    public string Path { get; set; } 

    [XmlElement("datelastread")] 
    public DateTime DateLastRead { get; set; } 

    [XmlElement("filter")] 
    public Filter FilterTypes { get; set; } 
} 

[Serializable()] 
public class DestinationFolder 
{ 
    [XmlElement("path")] 
    public string Path { get; set; } 

    [XmlElement("overwrite")] 
    public bool OverWrite { get; set; } 
} 

[Serializable()] 
public class FolderSetting 
{ 
    [XmlElement("id")] 
    public int ID { get; set; } 

    [XmlElement("source")] 
    public SourceFolder Source { get; set; } 

    [XmlElement("destination")] 
    public DestinationFolder Destination { get; set; } 
} 

[Serializable()] 
[XmlRoot("folderlist")] 
public class FolderList 
{ 
    public FolderList() 
    { 
     FolderSettings = new List<FolderSetting>(); 
    } 

    [XmlElement("foldersetting")] 
    public List<FolderSetting> FolderSettings; 
} 

Здесь я десериализации XML:

XmlSerializer serializer = new XmlSerializer(typeof(FolderList)); 
using (StringReader reader = new StringReader("C:\\Folders.xml")) 
{ 
    FolderList folders = (FolderList)(serializer.Deserialize(reader)); 
} 

Я следовал за одно предложение здесь, чтобы заполнить классы, которые у меня есть, и сериализуйте его, чтобы убедиться, что я получаю правильный формат для своих классов, и это все равно не помогает. Надеюсь, кто-то мог увидеть, чего я здесь не хватает.

ответ

1

Проблема заключается в использовании StringReader в вашей десериализации, вы должны использовать StreamReader:

using (StreamReader reader = new StreamReader("D:\\Folders.xml")) 
{ 
    FolderList folders = (FolderList)(serializer.Deserialize(reader)); 
} 

Таким образом, результат был сериализатор пытается десериализация «D: \ Folders.xml», а не файл данных, который OP пытался десериализовать.

0

В вашем XML отсутствует </folderlist > end tag.

Вы можете подтвердить свой XML здесь: http://www.xmlvalidation.com/

В качестве личного стиля кодирования, рассмотреть начиная классы с общим и перейти к конкретному. Это легче читать, когда вы сначала видите объект верхнего уровня.

+0

Извините. Я пропустил «пространство». –

+0

Попробуйте подтвердить подлинность xml – bdn02

+0

Я сделал. Я не нашел ошибки в XML. –

Смежные вопросы