2011-04-20 95 views
3

學校給了我一個XML文檔,我必須在屏幕上顯示信息。據我所知,Xml反序列化將是最簡單/最好的解決方案。C#XML反序列化錯誤(2,2)

我有這個至今:

public static List<Project> ProjectListDeserialize(string path) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(List<Project>)); 
    Stream filestream = new FileStream(path, FileMode.Open); 
    return (List<Project>)serializer.Deserialize(filestream); 
} 

public static Projects ProjectsDeserialize(string path) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(Projects)); 
    Stream filestream = new FileStream(path, FileMode.Open); 
    return (Projects)serializer.Deserialize(filestream); 
} 

這是XML文檔的樣子:

<?xml version="1.0" encoding="utf-16" ?>  
<Projects xmlns="http://www.pulse.nl/DynamicsAX/2009/DataSets" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Project ID ="1000.0001" CustomerID="1000"> 
     <Name>Project data key performance indicators</Name> 
     <Status>WorkInProgress</Status> 
     <StartDate>2011-01-01</StartDate> 
     <ExpectedCompletionDate>2011-08-01</ExpectedCompletionDate> 
     <CompletionDate xsi:nil="true" /> 
    </Project> 
    <Project ID ="1000.0008" CustomerID="1000" ParentID="1000.0001"> 
     <Name>Implementation</Name> 
     <Status>WaitListed</Status> 
     <StartDate>2011-06-01</StartDate> 
     <ExpectedCompletionDate>2011-08-01</ExpectedCompletionDate> 
     <CompletionDate xsi:nil="true" /> 
    </Project> 
</Projects> 

兩種方法都拋出同樣的異常:

<Projects xmlns='http://www.pulse.nl/DynamicsAX/2009/DataSets was not expected 

如何我可以正確反序列化上面的XML嗎?任何樣本都會有幫助!

+0

你定義的項目/ s的類定義命名空間? – mmix 2011-04-20 09:21:28

+0

您應該從Projects元素中刪除xmlns。或者寫一個自定義序列化程序。或者使用.NET SDK中的xsd工具生成與該Xml格式兼容的C#類 – 2014-01-14 14:40:35

回答

1

嘗試指定default namespace爲XML文檔中的XmlSerializer的構造函數:

var serializer = new XmlSerializer(typeof(Projects), "http://www.pulse.nl/DynamicsAX/2009/DataSets"); 

相關資源:

或者,您可以使用XmlTypeAttribute設置適當的命名空間

+0

我能夠通過結合兩個給定的答案來解決這個問題,謝謝! – 2011-04-20 15:43:22

2

最有可能的問題是,您沒有指定正確的名稱空間作爲Project類的屬性。

您可以告訴XmlSerializer在反序列化期間忽略名稱空間(檢查this answer)。

[XmlType(Namespace = "http://www.pulse.nl/DynamicsAX/2009/DataSets")] 
public class Project 
{ 
    ... 
} 
+0

我能夠通過結合兩個給定的答案來解決此問題,謝謝! – 2011-04-20 15:44:24