【问题标题】:Deserialize InnerXML to an Object in .NET将 InnerXML 反序列化为 .NET 中的对象
【发布时间】:2011-05-06 14:24:26
【问题描述】:

我正在处理一个包含无限集合的大型 xml 文件。这个想法是使用 XmlReader 读取文件并将内部 xml 反序列化为对象并进行进一步处理。

XML 结构是这样的:

<Basket xmlns="http://AppleFarm.com/Basket">
 <AppleCount>10000</AppleCount>
 <Apples>
  <Apple><ID>1</ID><Color>Red</Color></Apple>
  <Apple><ID>2</ID><Color>Green</Color></Apple>
  ...
  <Apple><ID>10000</ID><Color>Green</Color></Apple>
 </Apples>
</Basket>

使用 XMLReader 包裹 XMLTextReader 来读取文件一切顺利。但是,当我尝试将单个苹果反序列化为一个对象时,它会抛出 InvaildOperationException。

谁知道问题出在哪里?有更好的方法吗?

这里是代码片段

//Deserialize code
public object Deserialize(XmlDocument doc, Type type){
    using(XmlNodeReader reader - new XmlNodeReader(doc.DocumentElement)){
        XmlReaderSetting settings = new XmlReaderSettings();
        settings.ValidationType = ValidationType.None;
        using(XmlReader xReader = XmlReader.Create(reader, settings)){
            XmlSerializer serializer = new XmlSerializer(type);
            object obj = serializer.Deserialize(xReader);
        }
    }
}

public void GetApples(string filepath){
    XmlTextReader reader = new XmlTextReader(filepath);
    while(reader.Read()){
        while(reader.NoteType == XmlNodeType.Element &&
            reader.Name == "Apple"){
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(reader.ReadOuterXml());
            Apple a = (Apple)Deserialize(doc, typeof(Apple));

            //...
        }
    }
}
//Deserialize code end

//Apple class
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.XmlSerialization.XmlTypeAttribute(Namespace="http://AppleFarm.com/Basket")]
public partial class Apple{
    private string idField;
    private string colorField;

    public string Id{
        get{ return this.idField; }
        set{ this.idField = value; }
    }

    public string Color{
        get { return this.colorField; }
        set { this.colorField = value; }
    }
}
//Apple class end

【问题讨论】:

  • 你能发布你的反序列化代码和你的Apple类的代码吗?
  • 我已经为 xml 添加了代码和命名空间。
  • 是的,山姆,这是一个拼写错误。 :)
  • 你的反序列化方法对我有帮助,谢谢!!!!它的工作正常! =)

标签: .net serialization xml-deserialization


【解决方案1】:

XML 反序列化需要第一行是

<?xml version="1.0" encoding="utf-8"?>

如果要将部分 xml 文档转换为 Object,则必须在部分 XML 的顶部附加这一行。

另外,您需要使用 XmlRootAttribute 装饰 Apple 类,其中 ElementName 将为“Apple”

这篇文章描述了如何设置 XmlRootAtrribute http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlrootattribute.aspx

希望这会有所帮助

问候。

【讨论】:

  • 啊Shoaib,你是对的! Apple 类缺少的是 XmlRootAttribute。谢谢;)
  • 这是我添加的内容:[System.XmlSerialization.XmlRootAttribute(Namespace="AppleFarm.com/Basket")]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 2012-03-07
  • 2017-01-28
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多