2013-04-09 55 views
0

我已經使用需要反序列化到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中沒有Encoding.ASCII :( – KenD 2013-04-09 17:13:52

+1

編輯過,它也適用於UTF8。你能給我們準確的字符串輸出嗎?聽起來像是罪魁禍首。 – 2013-04-09 17:55:23

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 2013-04-09 17:19:28

+0

@KenD - 即使當我將AgentState.xml文件更改爲具有''它似乎仍然可以工作。完整的XML? – SwDevMan81 2013-04-09 18:44:21

相關問題