C#: XML 反序列化限制
C#: XML Deserialize limitation
我有点像 XML serial/deserialize 的新手,很想写一些通用的 classes。
在使用 XmlSerializer.Deserialize(typeof(T))
时,我意识到 T 对象应该与 XML 中的父元素同名。这是我用于此示例的 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();
这绝对可以正常工作,因为我的存储 class 名称是 "foodplaces",它是 XML 文件中的 topmost/parent 元素。
当我尝试将我的存储 class 重命名为 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.
中的 topmost/parent 元素,这将得到更正
问题:
1. 如果我想将此 XML 数据存储在其他 class 中,名称不同,例如 MyfoodPlaces,该怎么办?
2、使用LinQ有什么解决办法吗?
[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 and https://msdn.microsoft.com/en-us/library/2baksw0z(v=vs.110).aspx。
请注意 [Serializable]
不会 影响 xml 序列化;当你使用 XmlSerializer
.
时,不要相信任何人告诉你要包含它的人
我有点像 XML serial/deserialize 的新手,很想写一些通用的 classes。
在使用 XmlSerializer.Deserialize(typeof(T))
时,我意识到 T 对象应该与 XML 中的父元素同名。这是我用于此示例的 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();
这绝对可以正常工作,因为我的存储 class 名称是 "foodplaces",它是 XML 文件中的 topmost/parent 元素。
当我尝试将我的存储 class 重命名为 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.
中的 topmost/parent 元素,这将得到更正问题:
1. 如果我想将此 XML 数据存储在其他 class 中,名称不同,例如 MyfoodPlaces,该怎么办?
2、使用LinQ有什么解决办法吗?
[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 and https://msdn.microsoft.com/en-us/library/2baksw0z(v=vs.110).aspx。
请注意 [Serializable]
不会 影响 xml 序列化;当你使用 XmlSerializer
.