C#:XML反序列化限制

时间:2017-06-05 09:28:31

标签: c# linq xml-serialization xml-deserialization

我是一个新的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有什么解决方案吗?

1 个答案:

答案 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).aspxhttps://msdn.microsoft.com/en-us/library/2baksw0z(v=vs.110).aspx

请注意,[Serializable] 不会影响xml序列化;当你使用XmlSerializer时,不要相信任何告诉你的人。