2010-10-14 5 views
0

У меня есть XML-DOX вроде этого:C# ошибка XML сериализации

<?xml version="1.0" encoding="utf-8"?> 
<Server Manufacturer="SQL" Version="1"> 
    <Database Name="Test123" > 
    <Devices> 
     <Device Name="Testdata" ..../> 
     <Device Name="Testlog" ..../> 
    </Devices> 
    </Database> 
</Server> 

Я десериализации это следующим образом: вар базы данных = (База данных) xmlSerializer.Deserialize (новый StreamReader (xmlFilePath));

где База данных - это класс с набором устройств.

Он отлично работает, когда я комментирую теги сервера в файле XML, но я не хочу этого делать. Я получаю сообщение об ошибке «Ошибка в строке документа XMl (1, 4)»

Как я могу рассказать о сериализации для игнорирования тега сервера и мне нужно разместить пространство имен в файле XML?

Я попытался положить [XmlRootAttribute («База данных»)] на объект базы данных, но я все еще получаю ту же ошибку

+0

вы пытаетесь удалить атрибут кодировки? (это не решение, просто что-то проверить). Здесь я думаю, вам придется десериализовать сервер, а затем получить свой объект DataBase. –

+0

вы можете добавить свой класс .. – RameshVel

ответ

1

Если вы действительно не хотите, чтобы создать Server класс просто удалить «обертка» из загруженного XML.

Например, вместо этого:

(Database)xmlSerializer.Deserialize(
    new StreamReader(xmlFilePath)); 

сделать это:

(Database)xmlSerializer.Deserialize(
    XElement.Load(xmlFilePath).Element("Database").CreateReader()); 
0

Вы должны десериализации Server класс, который будет выглядеть как:

public class Server 
{ 
    public string Manufacturer{get;set;} 
    public int Version {get;set;} 
    public Database Database {get;set;} 
} 

Тогда десериализации:

var server = (Server)xmlSerializer.Deserialize(new StreamReader(xmlFilePath)); 
var database = server.Database; 
+0

Это мой единственный вариант? Мне не нужен объект Server в моем коде. Нет ли способа сказать сериализатору игнорировать этот тег? – Bob

+0

Я боюсь, что это не так ... –

+1

@Bob: вы можете перешагнуть тег Server, читая документ и получая его дочерние узлы: XmlDocument doc = new XmlDocument(); doc.Load (xmlFilePath); Console.WriteLine (doc.ChildNodes [1] .InnerXml); // child 0 - jmservera

0

Я считаю, что ваша XmlRootAttribute проблема, добавить сервер в XmlRootAttribute .. ниже пример кода

[Serializable] 
[XmlRootAttribute("Server", Namespace = "", IsNullable = false)]  
public class YourClass 
{ 
    public YourClass() 
    { 

    } 
    [XmlAttribute] 
    public string Manufacturer { get; set; } 
    .... 

} 

и десериализации сервер не базы данных

+0

Спасибо. Так это мой единственный вариант? Мне нужно десериализовать объект Server ... нет способа сообщить сериализатору игнорировать этот элемент? – Bob

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