2013-04-09 5 views
0

Я был приземлен с помощью XML-данных, которые мне нужно для десериализации на объекты в приложении Silverlight (v5). Данные выглядит следующим образом:Удаление десериализации XML без объявления или пространства имен в Silverlight

<AgentState> 
    <agentName>jbloggs</agentName> 
    <extension>12345</extension> 
    <currentlyIn>TestStatus</currentlyIn> 
</AgentState> 

Я создал класс на Silverlight стороны, и я пытаюсь получить этот XML - который, вы заметите, отсутствует декларацию и пространство имен - в объекты ,

StringReader sr = null; 
string data = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred); 
sr = new StringReader(data); 
XmlSerializer xs = new XmlSerializer(typeof (AgentState)); 
AgentState agent = (AgentState) xs.Deserialize(sr); 

.. но выдает ошибку an error in xml document (1,2), так как он отсутствует заявление. Даже ручное добавление фиктивного объявления дает дополнительные ошибки в отношении пропущенных пространств имен.

Я нашел other вопросы об игнорировании пространства имен/деклараций в XML, но ни один из них, похоже, не работает в Silverlight.

Может ли кто-нибудь посоветовать о наилучшем способе получения этого XML, десериализованного в объект?

ответ

0

мне удалось заставить его работать, используя следующий код - я не уверен, что это «правильный» способ делать вещи, но, похоже, это работает:

string data = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred); 

var document = XDocument.Parse(data); 
AgentState agent= (from c in document.Elements() 
         select new AgentState() 
            { 
             agentName = c.Element("agentName").Value, 
             extension = c.Element("extension").Value, 
             currentlyIn=c.Element("currentlyIn").Value 
            }).Single(); 

Спасибо за совет, он достал меня на правильном пути.

2

Это похоже на работу:

public class AgentState 
    { 
     public string agentName { get; set; } 
     public string extension { get; set; } 
     public string currentlyIn { get; set; } 
    } 

    static void Main(string[] args) 
    { 
     var s = @"<AgentState> 
        <agentName>jbloggs</agentName> 
        <extension>12345</extension> 
        <currentlyIn>TestStatus</currentlyIn> 
       </AgentState>"; 

     XmlSerializer serializer = new XmlSerializer(typeof(AgentState)); 
     var ms = new MemoryStream(Encoding.UTF8.GetBytes(s)); 
     var obj = serializer.Deserialize(ms); 
    } 
+1

В Silverlight нет кодировки.ASCII :( – KenD

+1

Отредактировано, оно также работает с UTF8. Можете ли вы дать нам точный вывод строки? Кажется, что это преступник. –

1

мне интересно, что выдают вас с добавлением декларации XML в строку. Это, кажется, работает нормально:

[System.Xml.Serialization.XmlRootAttribute("AgentState")] 
public class AgentState 
{ 
    public string agentName {get; set;} 
    public int extension {get; set;} 
    public string currentlyIn {get; set;} 
} 

public void RunSerializer() 
{ 
    System.Xml.Serialization.XmlSerializer agent_serializer = 
     new System.Xml.Serialization.XmlSerializer(typeof(AgentState)); 

    string agent_state_text = File.ReadAllText(@"C:\Temp\AgentState.xml"); 
    Console.WriteLine(agent_state_text + Environment.NewLine); 
    string xml_agent_state = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + agent_state_text; 
    Console.WriteLine(xml_agent_state + Environment.NewLine); 

    AgentState agent_state = new AgentState(); 
    using(StringReader tx_reader = new StringReader(xml_agent_state)) 
    { 
     if (tx_reader != null) 
     { 
      agent_state = (AgentState)agent_serializer.Deserialize(tx_reader); 
     } 
    } 
    Console.WriteLine(agent_state.agentName); 
    Console.WriteLine(agent_state.extension); 
    Console.WriteLine(agent_state.currentlyIn); 
} 

Выход:

<AgentState> 
    <agentName>jbloggs</agentName> 
    <extension>12345</extension> 
    <currentlyIn>TestStatus</currentlyIn> 
</AgentState> 

<?xml version="1.0" encoding="UTF-8"?> 
<AgentState> 
    <agentName>jbloggs</agentName> 
    <extension>12345</extension> 
    <currentlyIn>TestStatus</currentlyIn> 
</AgentState> 

jbloggs 
12345 
TestStatus 
+0

Хорошо, я пробовал это, но получаю 'System.InvalidOperationException: не ожидалось' – KenD

+0

@KenD - Даже когда я изменяю файл AgentState.xml, чтобы иметь '', он все еще работал. Не могли бы вы опубликовать полный XML? – SwDevMan81

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