【问题标题】:C#: XML Deserialize limitationC#:XML 反序列化限制
【发布时间】:2017-06-05 09:28:30
【问题描述】:

我是 XML 序列化/反序列化事物的新手,并且很想编写一些通用类。 在使用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 数据存储在其他具有不同名称的类中,例如 MyfoodPlaces,该怎么办?
2. 使用LinQ有什么解决办法吗?

【问题讨论】:

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


    【解决方案1】:
    [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 时包含它的人。

    【讨论】:

      猜你喜欢
      • 2011-05-12
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      相关资源
      最近更新 更多