我是一个新的XML序列/反序列化的东西和tyring写一些Generic类。
在使用XmlSerializer.Deserialize(typeof(T))
时,我意识到T对象应该与我的XML中的Parent元素具有相同的名称。这是我在这个例子中使用的XML文档,即FoodPlaces.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有什么解决方案吗?
答案 0 :(得分: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).aspx和https://msdn.microsoft.com/en-us/library/2baksw0z(v=vs.110).aspx。
请注意,[Serializable]
不会影响xml序列化;当你使用XmlSerializer
时,不要相信任何告诉你的人。