2017-06-05 12 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

谢谢。我希望能有你的回复:) –