2017-06-05 86 views
2

我有點新手與XML序列/反序列化的東西和tyring編寫一些泛型類。 在使用XmlSerializer.Deserialize(typeof(T))時,我意識到T對象應該與我的XML中的父元素具有相同的名稱。下面是我用這個例子即FoodPlaces.xml XML文檔:C#:XML反序列化限制

<foodplaces> 
      <foodplace> 
       <name> The Indian Restaurant</name> 
       <week> 47 </week> 
       <monday> 
        <food> Pasta </food> 
        <food> chineese food</food> 
        <food> veg food </food> 
       </monday> 
       <tuesday> 
        <food> Indian food</food> 
        <food> Veg food </food> 
       </tuesday> 
      </foodplace> 
      <foodplace> 
       <name> Restauran Italian </name> 
       <week> 47 </week> 
       <monday> 
        <food> Pizza </food> 
        <food> Checken  </food> 
        <food> sallad </food> 
       </monday> 
       <tuesday> 
        <food> Fish </food> 
        <food> ris </food> 
        <food> Biff </food> 
        <food> Checken </food> 
       </tuesday> 
      </foodplace> 
     </foodplaces> 

這是怎麼了,我反序列化這個XML:

var serializer = new XmlSerializer(typeof(foodplaces)); 
var fs = new FileStream(@"D:\FoodPlaces.xml", FileMode.Open); 
var reader = XmlReader.Create(fs); 

var fp = (foodplaces)serializer.Deserialize(reader); 
fs.Close(); 

這工作,因爲精絕我存儲類名稱是「foodplaces」,它是XML文件中最頂層/父元素。

當我想我的存儲類重命名爲MyFoodPlaces,發生這種情況:

*System.InvalidOperationException was unhandled 
    HResult=-2146233079 
    Message=There is an error in XML document (1, 2). 
    Source=System.Xml 
//Skipping stack trace: 
InnerException: 
     HResult=-2146233079 
     **Message=<foodplaces xmlns=''> was not expected.** 
     Source=Microsoft.GeneratedCode* 

,如果我將其重命名爲「foodplaces」,這是在XML中最頂層/父元素這將得到糾正。

問題:
1.如果我想將這個XML數據存儲在其他一些不同名稱的e.g MyfoodPlaces類中,該怎麼辦?
2.使用LinQ有什麼解決方案嗎?

回答

2
[XmlRoot("foodplaces")] 
public class ThisCanBeAnything {...} 

有一系列的屬性是影響這一點,包括[XmlRoot(...)][XmlElement(...)][XmlAttribute(...)][XmlArrayItem(...)][XmlArray(...)][XmlInclude(...)][XmlIgnore(...)]等,他們還允許XML命名空間(而不僅僅是默認的命名空間的完全控制)。

請參閱:https://msdn.microsoft.com/en-us/library/83y7df3e(v=vs.110).aspxhttps://msdn.microsoft.com/en-us/library/2baksw0z(v=vs.110).aspx瞭解更多信息。

請注意[Serializable]不會影響xml序列化;不要相信任何人在你使用XmlSerializer時告訴你包括這個。

+0

謝謝。我希望能有你的回覆:) –